问题:我需要设置什么才能编写 RSpec/Capybara 测试,这些测试涉及使用 Google 登录并以某种方式与数据库交互(通过应用程序或代码),然后成功地看到这些交互的结果反映在应用程序?
具体来说,我想要一个执行以下操作的规范:
Projects
在数据库中创建一些- 导航到项目索引(这会将我重定向到 Google 进行登录)
- 通过 Google 登录并允许我的应用访问
- 断言
Projects
出现在页面上
还有一个是这样的:
- 导航到项目索引(这会将我重定向到 Google 进行登录)
- 通过 Google 登录并允许我的应用访问
- 单击“添加项目”(将我重定向到表单)
- 填写表格并点击保存(将我重定向到索引)
- 断言新创建
Project
的出现在页面上
我为此编写的测试不起作用。
第一次尝试(使用“标准”RSpec/Capybara/Selenium)
我已经js: true
设置了适当的块并围绕每个规范describe
切换连接设置。WebMock
两个测试的最后一步都失败了。第一个只是没有显示任何项目。我可以puts Project.count
在断言页面上出现一些项目之前,我会看到一个非零数字,但页面上仍然没有显示任何内容。第二个测试的最后一步导致内部服务器错误。
基于此,似乎存在一些与数据库相关的问题
第二次尝试(添加一些数据库配置)
添加DatabaseCleaner.strategy = :truncation
到spec_helper
以及插入RSpec
配置块的以下代码:
config.around :each, js: true do |spec|
config.use_transactional_fixtures = false
DatabaseCleaner.start
WebMock.allow_net_connect!
spec.run
config.use_transactional_fixtures = true
DatabaseCleaner.clean
WebMock.disable_net_connect! :allow => %r{/((__.+__)|(hub/session.*))$}
end
与第一次尝试的结果相同。
第三次尝试(使用 Poltergeist 而不是 Selenium)
我安装phantomjs
、添加poltergeist
到我的 Gemfile 并捆绑。在spec_helper
我需要capybara/poltergeist
并设置Capybara.javascript_driver = :poltergeist
. 这似乎使事情变得更糟,因为我无法再通过允许访问的步骤,因为单击该按钮似乎什么也没做(或者驱动程序根本没有单击该按钮)。
附加信息
为了让我的测试开始工作,我必须做的第一件事是修复 Capybara 服务器上的端口,因为 Google API 需要预先注册的回调 URL。这很容易通过设置来Capybara.server_port = <some_number>
完成spec_helper.rb
。
我的控制器规格通过就好了,当我在现实生活中使用该应用程序时,它运行良好。这是第一个测试的代码(稍作修改的版本):
require 'spec_helper'
describe 'Projects', js: true do
it 'shows a list of projects' do
Project.create!(name: "foo")
visit projects_path
fill_in "Email", with: "validemail@gmail.com"
fill_in "Password", with: "password"
click_on "Sign in"
sleep 1.5 and click_on "Allow access" if page.has_content? "Allow access"
page.should have_content("foo")
end
end