1

问题:我需要设置什么才能编写 RSpec/Capybara 测试,这些测试涉及使用 Google 登录并以某种方式与数据库交互(通过应用程序或代码),然后成功地看到这些交互的结果反映在应用程序?

具体来说,我想要一个执行以下操作的规范:

  1. Projects在数据库中创建一些
  2. 导航到项目索引(这会将我重定向到 Google 进行登录)
  3. 通过 Google 登录并允许我的应用访问
  4. 断言Projects出现在页面上

还有一个是这样的:

  1. 导航到项目索引(这会将我重定向到 Google 进行登录)
  2. 通过 Google 登录并允许我的应用访问
  3. 单击“添加项目”(将我重定向到表单)
  4. 填写表格并点击保存(将我重定向到索引)
  5. 断言新创建Project的出现在页面上

我为此编写的测试不起作用。

第一次尝试(使用“标准”RSpec/Capybara/Selenium)

我已经js: true设置了适当的块并围绕每个规范describe切换连接设置。WebMock两个测试的最后一步都失败了。第一个只是没有显示任何项目。我可以puts Project.count在断言页面上出现一些项目之前,我会看到一个非零数字,但页面上仍然没有显示任何内容。第二个测试的最后一步导致内部服务器错误。

基于此,似乎存在一些与数据库相关的问题

第二次尝试(添加一些数据库配置)

添加DatabaseCleaner.strategy = :truncationspec_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
4

0 回答 0