rspec模拟对象属性赋值

cha*_*etm 5 ruby rspec ruby-on-rails

我有一个rspec模拟对象,一个值被赋值为属性.我很难在我的rspec测试中满足这种期望.只是想知道sytax是什么?代码:

def create
@new_campaign = AdCampaign.new(params[:new_campaign])
@new_campaign.creationDate = "#{Time.now.year}/#{Time.now.mon}/#{Time.now.day}"
if @new_campaign.save
  flash[:status] = "Success"
else
  flash[:status] = "Failed"
end end
Run Code Online (Sandbox Code Playgroud)

考试

it "should able to create new campaign when form is submitted" do
  campaign_model = mock_model(AdCampaign)
  AdCampaign.should_receive(:new).with(params[:new_campaign]).and_return(campaign_model)
  campaign_model.should_receive(:creationDate).with("#{Time.now.year}/#{Time.now.mon}/#{Time.now.day}")campaign_model.should_receive(:save).and_return(true)
  post :create

  flash[:status].should == 'Success' 
  response.should render_template('create') end
Run Code Online (Sandbox Code Playgroud)

问题是我收到此错误:

Spec::Mocks::MockExpectationError in 'CampaignController new campaigns should able to create new campaign when form is submitted' Mock "AdCampaign_1002" received unexpected message :creationDate= with ("2010/5/7")
Run Code Online (Sandbox Code Playgroud)

那么我如何设置对象属性赋值的期望?

谢谢

Jör*_*tag 13

Ruby中没有"属性赋值"这样的东西.在Ruby中,一切都是方法调用.所以,你就像你使用任何其他方法一样模拟setter方法:

campaign_model.should_receive(:creationDate=).with(...)
Run Code Online (Sandbox Code Playgroud)

顺便说一句:测试打印出的诊断消息不仅仅是shpw.在这种情况下,该消息已经告诉您需要知道的一切:

Spec::Mocks::MockExpectationError in 'CampaignController new campaigns should able to create new campaign when form is submitted' Mock "AdCampaign_1002" received unexpected message :creationDate= with ("2010/5/7")

正如您所看到的,您发布的消息已经告诉您,您需要在那里模拟该方法的名称:

 unexpected message :creationDate= with ("2010/5/7")
                    ^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)