如何构建此rails集成测试(使用shoulda),以便每次都不调用“visit”?

时间:2011-07-29 00:14:40

标签: ruby-on-rails integration-testing shoulda

使用Test :: Unit和shoulda,我想编写一个期望清晰的测试,所以我想出了这个:

context "logged in as seller" do
  setup do
    login @seller
    visit offer_path(@seller_offer)
  end

  should "not see feedback" do
    assert has_no_selector?("#feedback")
  end

  should "see 'cancel offer' button" do
    assert has_selector?("#cancel_offer_button")        
  end

  should "see 'comment' button" do
    assert has_selector?("#comment_button")
  end

  should "not see 'accept offer' button" do
    assert has_no_selector?("#accept")
  end

end

问题是,在每个“应该”阻止之前,重新执行设置 - 意味着两个页面请求(一个用于登录助手,另一个用于调用“访问”)。

我试过

context "logged in as seller" do
  login @seller
  visit offer_path(@seller_offer)

  should ...

但这似乎不起作用......显然我能做到:

context "logged in as seller" do
  should "have desired results" do
    login @seller
    visit offer_path(@seller_offer)

    # should see 'cancel offer' button
    assert has_selector?("#cancel_offer_button")        

    # should see 'comment' button"
    assert has_selector?("#comment_button")

    etc..

但这并不是我想要的。

-Patrick

1 个答案:

答案 0 :(得分:1)

对于初学者:如果你希望你的测试只测试一件事,就像它应该的那样,没有解决这个问题的方法,你已经做了正确的事。

但是,还有其他方法:在集成测试中,我通常会执行以下操作,而不是进行完整集成测试,并测试视图(页面上每个元素的外观):

  • 测试控制器,没有视图,最好不要访问数据库(使用存根)。
  • 单独测试视图:我在那里测试所有内容是否正确呈现
  • 在集成测试中:
    • 使用黄瓜
    • 做一个快乐路径点击方法(错误等已经单独测试)
    • 专注于javascript部分

希望这有帮助。