我正在使用Capybara + Rspec为遗留应用编写测试,并且我发现我的所有测试都需要在特定帧内运行。我在每次测试之前都写了一个小的rspec助手,以确认我是否正确设置了会话,然后访问了URL:
def set_session
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(
app,
window_size: [1280, 1024] ,
timeout: 60
)
end
Capybara.javascript_driver = :poltergeist
@sess = Capybara::Session.new :poltergeist
#authentication stuff here...
end
describe 'initiate_requests' do
before(:all) do
set_session
end
before(:each) do
@sess.visit(URL)
end
it 'shows error if not degree seeking student' do
@sess.within_frame(FRAME) {
set_test_vars(FAILID)
expect(@sess).to have_selector("#NO_PROGRAM_ERROR")
expect(@sess).not_to have_selector("#submitButton")
}
end
it 'works for a degree seeking student' do
@sess.within_frame(FRAME) {
set_test_vars(VALIDID)
expect(@sess).not_to have_selector("#NO_PROGRAM_ERROR")
expect(@sess).to have_selector("#submitButton")
}
end
end
这很好用。但是,我需要在表单中编写的每一个测试:
it 'works for a degree seeking student' do
@sess.within_frame(FRAME) {
#do tests..
}
end
有没有什么方法可以将@sess重置为只在帧内工作?缺乏这一点,我是否可以通过某种方式声明@ sess.within_frame(FRAME)一次并让所有测试都遵循该声明?
答案 0 :(得分:1)
我还没有特别尝试过,但你可以使用一个钩子而不是你之前的(:每个)钩子
around(:each) do |example|
@sess.visit(URL)
@sess.within_frame(FRAME) do
example.run
end
end