Dans rspec, vous voulez souvent vous moquer d'une méthode pour la rendre plus facile à tester.
Dans l'exemple ci-dessous, la méthode set_complex_config
affecte la méthode ʻadmin?`.
La méthode set_complex_config
a déjà son propre code de test et vous ne voulez que la réponse.
#L'exemple de code est approprié
class User
def admin?
res = set_complex_config
case res
when 'hoge'
'hoge'
when 'fuga'
'fuga'
end
end
def set_complex_config
#Traitement complexe
end
end
Je peux penser à deux façons de me moquer dans un tel cas, alors j'ai pensé à laquelle était la meilleure.
Comment remplacer la méthode set_complex_config de la classe User par la méthode singleton comme indiqué ci-dessous.
let(:hoge_let) { 'hoge' }
it do
user = create(:user)
hoge_var = 'hoge'
user.define_singleton_method(:set_complex_config) { hoge_var }
user.set_complex_config =>Bouge toi
user.define_singleton_method(:set_complex_config) { hoge_let }
user.set_complex_config => wrong number of arguments (given 0, expected 2..3)
end
À première vue, cela a l'air cool, mais dans ce cas, à l'intérieur du bloc example ou before, le bloc de la méthode define_singleton_method ne peut pas lire la variable let.
La méthode allow fonctionne correctement.
let(:hoge_let) { 'hoge' }
it do
user = create(:user)
allow(user).to receive(:attributes).and_return(hoge_let)
user.set_complex_config =>Bouge toi
end
Il semble préférable d'utiliser ʻallow (). To receive (). And_return () `docilement.
Recommended Posts