在为我的站点编写 rspec 测试时,我可以消除多个 within_frame 调用吗?
Can I eliminate multiple within_frame calls when writing rspec tests for my site?
我正在使用 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) 并让所有测试都遵循该声明?
我没有专门尝试过,但你可以使用 around hook 而不是 before(:each) hook
around(:each) do |example|
@sess.visit(URL)
@sess.within_frame(FRAME) do
example.run
end
end
我正在使用 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) 并让所有测试都遵循该声明?
我没有专门尝试过,但你可以使用 around hook 而不是 before(:each) hook
around(:each) do |example|
@sess.visit(URL)
@sess.within_frame(FRAME) do
example.run
end
end