Cucumber 不会接受 Capybara Minitest 规范断言

Cucumber wont accept Capybara Minitest Spec assertions

我在 Rails 4.2 中使用 Cucumber 和 Capybara,但我没有使用 RSpec。我一直坚持使用 Minitest。我在大部分测试中都使用 minitest:spec。

每当我尝试在 Cucumber 步骤中使用带有 minitest 或 minitest:spec 语法的断言时,我都会收到一条错误消息,指出断言方法未定义。例如这一步:

Then (/^the state selector has no states$/) do
  page.wont_have_selector(".my-css-class", :visible)
end

给出这个错误

undefined method `refute_selector' for nil:NilClass (NoMethodError)

(page.wont_have_selector 是 minitest 方法的 minitest:spec 语法 refute_selector)

我有一个包含此内容的文件 features/support/minitest.rb

require 'minitest'
require "minitest/rails/capybara"
require "minitest/spec"

module MiniTestAssertions

  def self.extended(base)
    base.extend(MiniTest::Assertions)
    base.assertions = 0
  end

  attr_accessor :assertions

end

World(MiniTestAssertions)

这是我的 Gemfile 测试部分

group :development, :test do
  gem 'byebug'
  gem 'web-console', '~> 2.0'
  gem 'spring'
  gem 'mocha', require: false
  gem 'cucumber-rails', require: false
  gem 'database_cleaner'
end

group :test do
  gem 'minitest-reporters'
  gem 'minitest-rails-capybara'
  gem 'minitest-spec-rails'
  gem 'capybara_minitest_spec'
  gem 'launchy'
  gem 'selenium-webdriver'
  gem 'poltergeist'
end

Gemfile.lock包括以下内容

capybara (2.4.4)
capybara_minitest_spec (1.0.5)
cucumber (1.3.20)
cucumber-rails (1.4.2)
minitest (5.7.0)
minitest-capybara (0.7.2)
minitest-metadata (0.5.3)
minitest-rails (2.2.0)
minitest-rails-capybara (2.1.1)
minitest-spec-rails (5.2.2)
rails (4.2.1)

编辑

只有 Capybara 特定的 Minitest 断言在 Cucumber 步骤文件中无法识别。如果我把步骤内容改成这样:

assert true
refute false

然后就过去了。此外,Capybara Minitest 断言在 test/features 目录中工作正常,用于在 Cucumber 之外进行集成测试。

我想我必须向 features/suport/minitest.rb 添加一些内容,以便将 Capybara Minitest 断言添加到 Cucumber World,但我不知道它是什么。

编辑

实际上只有 Capybara 的最小测试断言的规范版本出现了问题。如果我将步骤的内容更改为:

refute_selector(".my-css-class", :visible)

然后就可以了。

编辑

我认为是 capybara_minitest_spec gem 中的 bug #10 我重新打开了。

你可以试试

require 'capybara/cucumber'

在你的 minitest.rb 中。如果这导致问题,因为它需要 'capybara/rspec/matchers'(尽管该文件实际上并不需要 rspec),那么您可以只执行

World(Capybara::DSL)

然后实现测试环境所需的任何前后挂钩(参见 cucumber.rb

将此代码放入features/support/env.rb

Before do
  Thread.current[:current_spec] = self
end

这来自 ordinaryzelig's fix,用于 capybara_minitest_spec 添加对 Cucumber 的支持。