有很多方法可以在这里得到你想要的。最简单的方法是完全不用断言、期望或匹配器,而只使用断言。所以,假设你已经has_reply?
定义了方法,你可以使用这个:
assert page.has_reply?("my reply")
但是,这并没有得到你must_have_reply
所要求的语法。我怀疑你真的有has_reply?
方法。那么,让我们开始吧。
您问“如何获取对主题(即页面对象)的引用”。在这种情况下,主题是must_have_reply
定义方法的对象。因此,您应该使用this
而不是subject
. 但它并不像所有这些那么简单。assert_equal
匹配器添加了我们在通常的断言 ( , refute_equal
) 或期望 ( must_be_equal
, )中没有的间接级别wont_be_equal
。如果要编写 Matcher,则需要实现 Matcher API。
幸运的是,您不必真正实现 API。由于您似乎已经打算依赖 Cabybara 的have_css
匹配器,我们可以简单地使用 Capybara 的 HaveSelector 类并让它实现适当的 API。我们只需要使用返回 HaveSelector 对象的方法创建自己的 Matchers 模块。
# Require Minitest Matchers to make this all work
require "minitest/matchers"
# Require Capybara's matchers so you can use them
require "capybara/rspec/matchers"
# Create your own matchers module
module YourApp
module Matchers
def have_reply text
# Return a properly configured HaveSelector instance
Capybara::RSpecMatchers::HaveSelector.new(:css, ".comment_body", :text => text)
end
# Register module using minitest-matcher syntax
def self.included base
instance_methods.each do |name|
base.register_matcher name, name
end
end
end
end
然后,在您的minitest_helper.rb
文件中,您可以包含您的 Matchers 模块,以便您可以使用它。(此代码将在所有测试中包含匹配器。)
class MiniTest::Rails::ActiveSupport::TestCase
# Include your module in the test case
include YourApp::Matchers
end
Minitest Matchers 完成所有艰巨的任务。您现在可以将匹配器用作断言:
def test_using_an_assertion
visit root_path
assert_have_reply page, "my reply"
end
或者,您可以使用匹配器作为期望:
it "is an expectation" do
visit root_path
page.must_have_reply "my reply"
end
最后,您可以将其与主题一起使用:
describe "with a subject" do
before { visit root_path }
subject { page }
it { must have_reply("my reply") }
must { have_reply "my reply" }
end
重要提示:为此,您必须使用 'gem minitest-matchers', '>= 1.2.0' 因为 register_matcher 未在该 gem 的早期版本中定义。