2012-09-04 14 views
5

Mam linię w moim teście:MiniTest Spec niestandardowy układ dopasowujący

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

i uczynić go bardziej czytelnym chcę użyć niestandardowego dopasowywania:

page.must_have_reply "my reply" 

oparta na docs dla https://github.com/zenspider/minitest-matchers I oczekiwać muszę napisać matcher, który wygląda mniej więcej tak:

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

problem polega na tym, że nie mogę zobaczyć, jak aby uzyskać odniesienie do tematu (tj. obiekt strony). Dokumenty mówią: "Uwaga: temat musi być pierwszym argumentem w asercji", ale to naprawdę nie pomaga.

Odpowiedz

6

Jest trochę przykład, można utworzyć klasę, która powinna reaguje na zestaw metod matches?, failure_message_for_should, failure_message_for_should_not. W metodzie matches? można uzyskać odwołanie do tematu.

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 
1

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.

Powiązane problemy