我想将控制器或页面行为的多个方面作为单独的测试进行测试,但是加快我的测试速度,但只运行一次控制器或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在每次测试后清除响应对象(或者,对于水豚,页面对象)。因此,无论我在控制器测试中检查assigns
,response
对象,还是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注释,所以我记得我正在测试的内容,这只是一团糟。
在每个人都告诉我不要将测试状态从测试维护到测试之前,这不是我正在做的事情:我想检查与单个状态相关的独立变量。
由于
答案 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绑定。