Подтвердить что ты не робот

Есть ли способ отменить Mocha stubbing any_instance в Test:: Unit

Как и этот вопрос, я тоже использую Ryan Bates nifty_scaffold. Он имеет желательный аспект использования метода Mocha any_instance для принудительного "недопустимого" состояния в объектах модели, скрытых за контроллером.

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

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

4b9b3361

Ответ 1

Как это случается, 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!"

Ответ 2

Mocha не обеспечивает такую ​​функциональность. Однако вы можете реализовать его самостоятельно.

Первое, что мы должны знать о 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

Ответ 3

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

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