Javascript rspec测试:放置:js=>;true还影响before块
我有一个用于预约的页面,它有一些javascript代码,可以选择预约最早的时间和日期,之后用户可以单击按钮安排预约 为了测试这一点,我写了一些rspec测试,如下所示 预约书规格rbJavascript rspec测试:放置:js=>;true还影响before块,javascript,ruby-on-rails,rspec,linkedin-gem,Javascript,Ruby On Rails,Rspec,Linkedin Gem,我有一个用于预约的页面,它有一些javascript代码,可以选择预约最早的时间和日期,之后用户可以单击按钮安排预约 为了测试这一点,我写了一些rspec测试,如下所示 预约书规格rb context "when on the profile page" do before do click_linkedin_button end it 'book an appointment', :js => true do click_link "new-appoi
context "when on the profile page" do
before do
click_linkedin_button
end
it 'book an appointment', :js => true do
click_link "new-appointment"
choose "doctor1"
click_button "Submit and Schedule"
expect(page).to have_content "Congrats!"
end
end
click_linkedin_按钮是一种方法定义,它只是通过linkedin oauth登录用户。问题是,即使在设置了OmniAuth.config.mock_auth[:linkedin]
之后,每当我在其块周围设置:js=>true时,它都会要求我通过linkedin登录
我想知道是否有人知道如何解决这个问题
以下是可能与此问题相关的其他文件
spec_helper.rb
require 'capybara/webkit/matchers'
Capybara.javascript_driver = :webkit
Gemfile
gem 'capybara-webkit'
gem 'database_cleaner'
gem 'capybara'
在rspec块中设置
js:true
是在整个示例中使用启用javascript的驱动程序的快捷方式。因此,该驱动程序将在整个执行或示例期间可用和使用,其中包括所有before/after/around块
为了解决这个问题,您可以在示例中需要使用的位置手动设置要使用的驱动程序,而不是使用js:true
it {
do_some_stuff_with_default_driver
Capybara.current_driver = :webkit
do_some_stuff_with_webkit
Capybara.current_driver = :selenium
do_some_stuff_with_selenium
}
编辑 哎呀,我刚刚读到这篇文章,所以这个解决方案可能不会起作用。请让我知道
注意:切换驱动程序创建一个新的会话,因此您可能无法在测试中间切换。
我通过创建一个实际的linkedin帐户解决了这个问题,将身份验证信息放在.env中,并在回调期间调用fill_in方法来填写电子邮件和密码字段。并坚持在整个上下文块中运行js驱动程序
编辑:这当然不是最好的答案,所以我仍然接受其他答案 正如您所发现的,您不能使用一个驱动程序运行部分测试,而使用另一个驱动程序运行部分测试。这等于说
Given I login in using Safari.
Then I should be logged in using Firefox.
因此,您的解决方案是,您必须在测试环境中运行js登录代码才能登录。这实际上是一件好事(您希望测试js登录代码)。如果您希望避免实际连接到linkedin,那么每次运行此测试时,都需要模拟到linkedin的连接。查看VCR(),这将允许您记录与linkedin的连接,以便在后续测试中不必转到linkedin。您是否尝试过在上下文块而不是it块中设置js:true?是的,这并没有解决问题。您忘记启用模拟了吗
OmniAuth.config.test\u mode=true
(请参阅)否。在spec_helper.rb中设置它