2012-06-03 15 views
22

Chcę przetestować, czy funkcja prawidłowo wywołuje inne funkcje z minimalną Ruby, ale nie mogę znaleźć odpowiedniego assert do testowania z doc.Jak stwierdzić, że pewna metoda jest wywoływana za pomocą frameworka ruby ​​minitest?

Kod źródłowy
class SomeClass 
    def invoke_function(name) 
    name == "right" ? right() : wrong() 
    end 

    def right 
    #... 
    end 

    def wrong 
    #... 
    end 
end 
Kod testu:
describe SomeClass do 
    it "should invoke right function" do 
    # assert right() is called 
    end 

    it "should invoke other function" do 
    # assert wrong() is called 
    end 
end 

Odpowiedz

21

Z MiniTest użyć expect sposób ustawić oczekiwanie dla metody, która zostanie wywołana w mock obiektu jak tak

obj = MiniTest::Mock.new 
obj.expect :right 

Jeśli chcesz ustawić oczekiwanie za pomocą parametrów i wartości zwracanych, to:

obj.expect :right, return_value, parameters 

A dla konkretnego przedmiotu tak:

obj = SomeClass.new 
assert_send([obj, :right, *parameters]) 
+2

Na betonowej wersji obiektu, nie ma 'must_send' uwagę przy użyciu' MiniTest/spec' – Frost

+0

Powiedz mi jeśli czegoś brakuje, ale myślę, że odpowiedź @ jing-li poniżej jest poprawna we wspomnianiu, że "assert_send" nie jest tutaj odpowiednie. OP chce przetestować, czy 'right' jest wywoływane, gdy wywoływana jest' invoke_function'. Dodatkowo, 'obj.verify' jest potrzebne, aby zapewnić, że' right' jest wywoływane na symulowanym obiekcie w pierwszej części tej odpowiedzi. Każdemu, kto to czyta, upewnij się, że testy zakończą się niepowodzeniem, zanim je przejdziesz. – monozok

+0

Myślę, że używanie assert_send nie jest bezpiecznym wyborem. zgodnie z dokumentacją: http://ruby-doc.org/stdlib-2.0.0/libdoc/minitest/rdoc/MiniTest/Assertions.html#method-i-assert_send –

9

MiniTest ma specjalną .expect :call na sprawdzenie, czy jakaś metoda jest wywoływana.

describe SomeClass do 
    it "should invoke right function" do 
    mocked_method = MiniTest::Mock.new 
    mocked_method.expect :call, return_value, [] 
    some_instance = SomeClass.new 
    some_instance.stub :right, mocked_method do 
     some_instance.invoke_function("right") 
    end 
    mocked_method.verify 
    end 
end 

Niestety ta funkcja nie jest dobrze udokumentowana. Znalazłem o tym stąd: https://github.com/seattlerb/minitest/issues/216

0

Zgodnie z podanym przykładem, nie ma innej klasy delegatów, a chcesz się upewnić, że metoda jest poprawnie wywoływana z tej samej klasy. Następnie poniżej fragment kodu powinien działać:

class SomeTest < Minitest::Test 
    def setup 
    @obj = SomeClass.new 
    end 

    def test_right_method_is_called 
    @obj.stub :right, true do 
     @obj.stub :wrong, false do 
     assert(@obj.invoke_function('right')) 
     end 
    end 
    end 

    def test_wrong_method_is_called 
    @obj.stub :right, false do 
     @obj.stub :wrong, true do 
     assert(@obj.invoke_function('other')) 
     end 
    end 
    end 
end 

Ideą jest skrótową [method_expect_to_be_called] powracając prosty prawdziwą wartość, w bloku wejściowym dochodzić to rzeczywiście miano i zwrotu prawdziwą wartość . Aby uzyskać drugą nieoczekiwaną metodę, należy się upewnić, że nie jest wywoływana.

Uwaga: assert_send nie będzie działać poprawnie. Proszę zapoznać się z official doc.

W rzeczywistości poniżej rachunku minie, ale nie oznacza, że ​​wszystko działa zgodnie z oczekiwaniami:

assert_send([obj, :invoke_function, 'right']) 
# it's just calling invoke_function method, but not verifying any method is being called 
Powiązane problemy