如何在RSpec中为一个控制器负载或Capypara页面加载运行多个测试?

时间:2012-02-03 17:00:40

标签: ruby-on-rails rspec capybara

我想将控制器或页面行为的多个方面作为单独的测试进行测试,但是加快我的测试速度,但只运行一次控制器或capybara页面加载一次以进行多次检查。例如,使用控制器测试:

      it "should include all videos in the list of all videos" do
        get :show, id: event.id
        response.should be_somehow
      end

      it "should set the main video to be the paid video" do
        get :show, id: event.id
        response.should be_somehow_else
      end

我希望这成为:

      before :all do
        get :show, id: event.id
      end

      it "should include all videos in the list of all videos" do
        response.should be_somehow
      end

      it "should set the main video to be the paid video" do
        response.should be_somehow_else
      end

问题是RSpec在每次测试后清除响应对象(或者,对于水豚,页面对象)。因此,无论我在控制器测试中检查assignsresponse对象,还是page导致Capybara,都不会有这样的效果:

before :all do
  get :show, id: event.id
  @response = response
end
example "it should do something" do
  @response.should be_somehow # test works
end
example "it should do something else" do
  @response.should be_somehow_else # test fails; @response has been flushed by Rails testing facilities
end

因此,测试加速的解决方案是在单个测试中进行多次检查:

example "it should be totally correct in every way" do
  get :show, id: event.id
  response.should be_somehow # test works
  response.should be_somehow_else # test works
end

但这会激发我对测试命名的敏感性。

到目前为止,这是Capybara中最恶化的,我可能会在其中进行多步设置(登录,许可)过程,并且在单个页面加载时需要检查15件事情:是否显示了所有正确的内容?其他不正确的事情没有显示出来吗? javascript动作是否与正确的事物捆绑在一起?是否呈现了正确的骨干模板?这些测试很快就会成为20条连续的should语句,内联Ruby注释,所以我记得我正在测试的内容,这只是一团糟。

在每个人都告诉我不要将测试状态从测试维护到测试之前,这不是我正在做的事情:我想检查与单个状态相关的独立变量。

由于

1 个答案:

答案 0 :(得分:0)

这似乎是录像机进入画面的绝佳时机。例如:

before :all do
  event = Event.create
  VCR.use_cassette('show_event') do
    make_http_request(:get, "http://localhost:3000/event/#{event.id}")
    make_http_request(:get, "http://localhost:3000/#{event.id}")
  end
end

it "should include all videos in the list of all videos" do
  use_vcr_cassette "show_event"
  response.should be_somehow
end

it "should set the main video to be the paid video" do
  use_vcr_cassette "show_event"
  response.should be_somehow_else
end

在运行所有测试(不是每个测试)之前发出请求,将其存储在YAML中,然后在每次测试时选择YAML。

这可以减少您的开销,更改为IO绑定而不是Rack / Environment绑定。