Rails测试,多次测试

时间:2013-09-16 13:34:24

标签: testing rspec

我正在阅读这篇博文:

http://clarkware.com/blog/2007/09/08/how-would-you-test-this

并在最后看到了这段代码:

describe MenuItemsController, 'Creating a new menu item' do

  before do
    @attributes = {'name' => "Enchilada", 'price' => 4.99}
    @menu_item = mock_model(MenuItem)
    MenuItem.should_receive(:new).with(@attributes).once.
      and_return(@menu_item)
  end

  it 'should redirect to index with a notice on successful save' do
    @menu_item.should_receive(:save).with().once.and_return(true)

    post :create, :menu_item => @attributes

    assigns[:menu_item].should be(@menu_item)
    flash[:notice].should_not be(nil)    
    response.should redirect_to(menu_items_url)
  end

  it 'should re-render new template on failed save' do
    @menu_item.should_receive(:save).with().once.and_return(false)

    post :create, :menu_item => @attributes

    assigns[:menu_item].should be(@menu_item)
    flash[:notice].should be(nil)    
    response.should be_success
    response.should render_template('new')
  end

end

我的印象是,最好将每个测试(应该,断言,期望)放在它自己的'it'块中。这段代码有几个。

是的,它使代码更易于阅读,但如果例如行flash[:notice].should_not be(nil)失败,那么您的结果将不会直接指向该测试吗?

这里有什么建议?每个测试单独或捆绑一些以帮助可读性?

尼尔

1 个答案:

答案 0 :(得分:0)

一般来说,最好的方法是每个测试描述只放一个断言,但它仍在讨论中,如下所示:http://betterspecs.org/#single

对于某些情况,我同意在同一测试中的许多expect可能有用,但是,例如,如果第一个expect失败,那么rspec将停止运行该测试并且只是说这个一个失败了。