各位好,小弟想请教一下这个测试应该怎样写。
它是一个 LettersController 的测试,LettersController 的代码如下:
class LettersController < ApplicationController
def create
letter = Letter.new(params[:letter])
if letter.save
ContactMailer.new_letter(UserEmail.active_emails, letter.subject,letter.content.html_safe).deliver
redirect_to letter_path(letter)
else
redirect_to letter_path
end
end
end
走第二条路径是没问题,只是写到那个用 Email 发信息的 ContractMailer 的时候,我本来想把 new_letter 和 deliver 这两个给架空的,但执行到这里的时候,html_safe 出现了问题,“NoMethodError: undefined method `html_safe' for nil:NilClass”,然后我在.stub_chain 那里加上 html_safe 还是不能通过。不知道有什么样的方法或者写法可以使这个测试通过呢?下面附带上 spec 的代码。
require 'spec_helper'
describe LettersController do
let(:letter) {mock_model(Letter)}
describe "Get 'create'" do
it "should return letter false" do
Letter.should_receive(:new).with("[email protected]").and_return(letter)
letter.should_receive(:save).and_return(false)
post 'create',:letter =>"[email protected]"
response.should redirect_to(letter_path)
end
it "should return letter success" do
Letter.should_receive(:new).with("[email protected]").and_return(letter)
letter.should_receive(:save).and_return(true)
#测试不通过在这里
ContactMailer.stub_chain(:letter,:deliver)
post 'create',:letter =>"[email protected]"
response.should redirect_to(letter_path(letter))
end
end
end
我是想把 ContactMailer.new_letter(UserEmail.active_emails, letter.subject,letter.content.html_safe).deliver 这一行代码检验有没有成功执行,是不是还是通过构造一些数据直接写到里面?还是说直接把这一行给架空了?希望有兴趣的朋友可以帮忙看看有什么办法,谢谢啦,晚安。