Есть ли способ отменить Mocha заглушку any_instance в Test :: Unit - PullRequest
24 голосов
/ 24 мая 2010

Так же, как этот вопрос , я тоже использую nifty_scaffold Райана Бейтса.У него есть желательный аспект использования метода Mocha any_instance для принудительного установки «недопустимого» состояния в объектах модели, спрятанных за контроллером.

В отличие от вопроса, с которым я связан, я не использую RSpec, но Test :: Unit.Это означает, что два RSpec-центричных решения там не будут работать для меня.

Существует ли общий (то есть: работает с Test :: Unit) способ удаления заглушки any_instance?Я считаю, что это вызывает ошибку в моих тестах, и я хотел бы проверить это.

Ответы [ 3 ]

40 голосов
/ 21 декабря 2011

Как это бывает, Mocha 0.10.0 позволяет отменить вставку в any_instance () .

str = "Not Stubbed!"
String.any_instance.stubs(:to_s).returns("Stubbed!")
puts str.to_s   # "Stubbed!"
String.any_instance.unstub(:to_s)
puts str.to_s   # "Not Stubbed!"
4 голосов
/ 24 мая 2010

Мокко не предоставляет такой функциональности. Однако вы можете реализовать это самостоятельно.

Первое, что мы должны знать о mocha, это то, что mocha фактически заменяет оригинальные методы, когда вы их заглушаете. Таким образом, чтобы иметь возможность восстановить эти методы позже, вы должны сохранить ссылку на прежние. Это может быть легко достигнуто путем: alias new_method old_method. Это должно быть сделано до насмешки над old_method.

Теперь, чтобы разблокировать метод, вам нужно всего лишь alias old_method new_method.

Рассмотрим следующий код:

class A
    def a
        true
    end
end


class TestA < Test::Unit::TestCase
    def test_undo_mock
        a = A.new
        A.class_eval {alias unmocked_a a}

        A.any_instance.stubs(:a).returns("b")
        assert a.a, "b"

        A.class_eval {alias a unmocked_a}
        assert a.a, "a"
    end
end
0 голосов
/ 11 января 2016

Если вы хотите удалить все свои заглушки / ожидания за один раз, то вы можете сделать это с помощью mocha_teardown (например, вызвать self.mocha_teardown).

Однако в этом случае может быть немного разрушительным.

...