Istnieje wiele sposobów na uzyskanie tego, co chcesz. Najprostszym sposobem jest nie zadzieraj z twierdzeniami, oczekiwaniami lub matematami i po prostu używaj asercji. Tak więc, zakładając, że mają już metoda has_reply?
zdefiniowane, można po prostu użyć tego:
assert page.has_reply?("my reply")
jednak, że nie dostać się składni must_have_reply
prosicie. I wątpię, czy naprawdę masz metodę has_reply?
. A więc zacznijmy.
Twoje pytanie "jak uzyskać odniesienie do tematu (np. Obiektu strony)". W tym przypadku obiektem jest obiekt, który jest zdefiniowany w metodzie must_have_reply
. Tak więc powinieneś użyć this
zamiast subject
. Ale nie jest tak proste, jak wszystko. Dopasowania dodają poziom niedostrzegalności, którego nie posiadamy w zwykłych asercjach (assert_equal
, refute_equal
) lub Oczekiwaniach (must_be_equal
, wont_be_equal
). Jeśli chcesz napisać Matchera, musisz wdrożyć API Matchera.
Na szczęście nie musisz zaimplementować interfejsu API. Ponieważ wydaje się, że zamierzasz polegać na macierzy Cabybara have_css
, możemy po prostu użyć klasy HaveSelector Capibary i pozwolić jej zaimplementować odpowiedni interfejs API. Musimy tylko stworzyć nasz własny moduł Matchers za pomocą metody zwracającej obiekt HaveSelector.
# 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
Następnie w pliku minitest_helper.rb
można dołączyć moduł dopasowujących, dzięki czemu można go używać. (Ten kod będzie obejmował moduł dopasowujący we wszystkich testach.)
class MiniTest::Rails::ActiveSupport::TestCase
# Include your module in the test case
include YourApp::Matchers
end
Minitest Matchers wykonuje wszystkie trudne operacje podnoszenia.Można teraz można użyć dopasowywania jako twierdzenie:
def test_using_an_assertion
visit root_path
assert_have_reply page, "my reply"
end
Lub można użyć dopasowywania jako oczekiwanie:
it "is an expectation" do
visit root_path
page.must_have_reply "my reply"
end
I wreszcie można go używać z tematem:
describe "with a subject" do
before { visit root_path }
subject { page }
it { must have_reply("my reply") }
must { have_reply "my reply" }
end
Ważne: aby to działało, należy używać „gem MiniTest-dopasowujących”, „> = 1.2.0” bo register_matcher nie jest zdefiniowana we wcześniejszych wersjach tego ge m.