2012-03-28 10 views
13

Test etmek için bir Rails denetleyici eylemim var. Bu eylemde, User.can bir yöntem mi? farklı parametrelerle birkaç kez çağrılır. Bunun için test durumlarından birinde, User.can? ('Çekme') çağrıldığından emin olmak istiyorum. Ama User.can'ın çağrışımlarını umursamıyorum? diğer parametrelerle.Mocha: Farklı parametrelerle birden çok çağrı olduğunda bir yöntemin beklentisini nasıl ekleyebilirim

User.any_instance.expects(:can?).with('withdraw').at_least_once.returns(true) 

Ama testi User.can beklenmedik çağırma belirten iletisiyle başarısız oldu ('mevduat'):

def action_to_be_tested 
    ... 
    @user.can?('withdraw') 
    ... 
    @user.can?('deposit') 
    ... 
end 

ben testte aşağıda çalıştı?. 'Deposit' parametresiyle başka bir beklenti eklerseniz, test geçti. Ancak, "geri çekme" parametresiyle çağrıma odaklanabileceğim herhangi bir yol olup olmadığını merak ediyorum (çünkü diğer çağrılar bu test vakasıyla ilgisizdir).

cevap

15

Sadece alakasız parametrelerle çağırmaları dışarı stubbing tarafından, geçici bir çözüm buldu:

User.any_instance.expects(:can?).with('withdraw').at_least_once.returns(true) 
User.any_instance.stubs(:can?).with(Not(equals('withdraw'))) 

http://mocha.rubyforge.org/classes/Mocha/ParameterMatchers.html#M000023

+0

[API] 'nın (http://gofreerange.com/mocha/docs/Mocha/Expectation.html#with-instance_method) literal değerleri (değişkenlerle doğrudan karşılaştırmalar) desteklediği veya bloğa izin verdiğinin farkındaydım. "Not (...)" yapısının nereden geldiğinden emin değilim. Daha detaylı olarak konuşabilir misiniz? – Pysis

+0

@Pysis 'Not()', with with() 'ile kullanılan [Mocha :: ParameterMatchers] (http://gofreerange.com/mocha/docs/Mocha/ParameterMatchers.html) adresinden gelir. HasKey() gibi bir deve hastası olabilirler ya da has_key() 'gibi bir yılan gibi olabilirler. 'Değil' deve vakası olmalı, çünkü bir anahtar kelime. –

12

Sen with bir blok geçmek ve bu blok argümanlar incelemek olabilir.

invocations = ['withdraw', 'deposit'] 
User.any_instance.expects(:can?).at_most(2).with do |permission| 
    permission == invocations.shift 
end 

can? her çağrıldığında, Mocha bloğuna verecektir: yani kullanarak, beklenen çağırmaları bir listesini oluşturabilirsiniz. Blok, beklenen çağrıların listesinden bir sonraki değeri çekecek ve gerçek çağrışımla karşılaştıracaktır.

İlgili konular