测试 请教一下这个测试用 rspec 怎样写,谢谢啦。。

railstdf · 2012年02月26日 · 最后由 railstdf 回复于 2012年02月26日 · 3712 次阅读

各位好,小弟想请教一下这个测试应该怎样写。
它是一个 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 这一行代码检验有没有成功执行,是不是还是通过构造一些数据直接写到里面?还是说直接把这一行给架空了?希望有兴趣的朋友可以帮忙看看有什么办法,谢谢啦,晚安。

不是技术问题,是不细心的问题

NoMethodError:  undefined method `html_safe' for nil:NilClass

html_safe 这个方法是属于 letter.content 的,所以关键是 mock 出的那个 letter 要有 content,或者它的 content 方法返回不为 nil,比如类似这样(代码仅供示意):

letter.should_receive(:content).and_return('some content')

#1 楼 @fsword 谢谢你的提醒,修复好了。。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号