7

テストに次の行があります。

page.has_reply?("my reply").must_equal true

読みやすくするために、カスタムマッチャーを使用したいと思います。

page.must_have_reply "my reply"

https://github.com/zenspider/minitest-matchersのドキュメントに基づいて、次のようなマッチャーを作成する必要があると思います。

def have_reply(text)
  subject.has_css?('.comment_body', :text => text)
end
MiniTest::Unit::TestCase.register_matcher :have_reply, :have_reply

問題は、サブジェクト (つまり、ページ オブジェクト) への参照を取得する方法がわからないことです。ドキュメントには、「メモの件名はアサーションの最初の引数でなければなりません」と書かれていますが、それは実際には役に立ちません。

4

2 に答える 2

7

ちょっとした例があります。一連のメソッドmatches?failure_message_for_should、に応答するクラスを作成できますfailure_message_for_should_not。メソッドではmatches?、サブジェクトへの参照を取得できます。

class MyMatcher
  def initialize(text)
    @text = text
  end

  def matches? subject
    subject =~ /^#{@text}.*/
  end

  def failure_message_for_should
    "expected to start with #{@text}"
  end

  def failure_message_for_should_not
    "expected not to start with #{@text}"
  end
end

def start_with(text)
  MyMatcher.new(text)
end
MiniTest::Unit::TestCase.register_matcher :start_with, :start_with

describe 'something' do
  it 'must start with...' do
    page = 'my reply'
    page.must_start_with 'my reply'
    page.must_start_with 'my '
  end
end
于 2012-09-04T16:32:07.537 に答える
1

ここで欲しいものを手に入れる方法はたくさんあります。最も簡単な方法は、アサーション、期待値、またはマッチャーをまったくいじらず、単にアサートを使用することです。したがって、すでにメソッドが定義されていると仮定すると、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.rbMatchers モジュールをファイルに含めて、使用できるようにします。(このコードは、すべてのテストにマッチャーを含めます。)

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 が定義されていないためです。

于 2012-09-04T23:43:31.130 に答える