ここで欲しいものを手に入れる方法はたくさんあります。最も簡単な方法は、アサーション、期待値、またはマッチャーをまったくいじらず、単にアサートを使用することです。したがって、すでにメソッドが定義されていると仮定すると、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' を使用する必要があります。これは、その gem の以前のバージョンでは register_matcher が定義されていないためです。