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