2010-05-24 6 views
17

Очень похоже на this question, я тоже использую nifty_scaffold Райана Бэйтса. Он имеет желательный аспект использования метода any_instance Mocha для принудительного «недопустимого» состояния в объектах модели, скрытых за контроллером.Есть ли способ отменить Mocha stubbing any_instance в Test :: Unit

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

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

ответ

31

Как это происходит, мокко 0.10.0 позволяет unstubbing on 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

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 
+0

Отлично. Это похоже на что-то, что можно добавить/обезьяны в Мокку тоже. –

+0

Я никогда не чувствовал необходимости в этой функции, но есть билет - http://floehopper.lighthouseapp.com/projects/22289-mocha/tickets/69-allow-unstubbing-of-methods, если вы хотите лоббировать для изменения. Было бы здорово, если бы у вас были примеры того, почему вы хотите его использовать. –

+0

Я добавил неупорядоченную функциональность - Mocha :: ObjectMethods # unub - см. Http://mocha.rubyforge.org/classes/Mocha/ObjectMethods.html#M000009 –

0

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

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

Смежные вопросы