[RUBY] Si vous souhaitez simuler une méthode dans RSpec, vous devez utiliser la méthode allow pour mock et la méthode singleton.

Aperçu

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 se moquer

① Définissez une méthode singleton et simulez

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.

② Mock avec la méthode allow

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

Conclusion

Il semble préférable d'utiliser ʻallow (). To receive (). And_return () `docilement.

Recommended Posts

Si vous souhaitez simuler une méthode dans RSpec, vous devez utiliser la méthode allow pour mock et la méthode singleton.
Lorsque vous souhaitez utiliser la méthode à l'extérieur
Vous pouvez ne pas vouloir utiliser la méthode remove sur ArrayList très souvent
Je veux appeler une méthode et compter le nombre
Si vous souhaitez inclure la classe parente dans @builder de Lombok
[Swift] Lorsque vous voulez savoir si le nombre de caractères dans String correspond à un certain nombre ...
[Pour les super débutants] Les connaissances minimales que vous voulez garder à l'esprit avec les hachages et les symboles
Comment tester une méthode privée et la simuler partiellement en Java
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
[RSpec] Lorsque vous souhaitez utiliser la variable d'instance du contrôleur dans le test [attribuer n'est pas recommandé]
Si vous souhaitez satisfaire la couverture de test des méthodes privées dans JUnit
Si vous utilisez Android Room et que vous souhaitez modifier la définition de colonne
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
Utilisez-vous l'instruction for après tout? Utilisez-vous l'instruction while? Utilisation correcte des instructions for et while
Pour ceux qui souhaitent utiliser MySQL pour la base de données dans la construction de l'environnement de Rails6 ~.
Je veux utiliser une petite icône dans Rails
Si vous souhaitez utiliser Mockito avec Kotlin, utilisez mockito-kotlin
Comment se moquer d'un appel de super méthode dans PowerMock
Je souhaite utiliser PowerMock dans une classe qui combine des tests paramétrés et des tests ordinaires
Je veux cliquer sur une broche GoogleMap dans RSpec
Utilisez la recherche binaire pour voir s'il y a des valeurs dans le tableau
Si hash [: a] [: b] [: c] = 0 dans Ruby, je veux que vous étendiez récursivement même si la clé n'existe pas
Que faire si vous sélectionnez un JRE dans Eclipse et obtenez "Le JRE sélectionné ne prend pas en charge le niveau de conformité actuel 11"
Si vous souhaitez transformer une application Java en une image Docker, il est pratique d'utiliser jib.
Utilisez JLine lorsque vous souhaitez gérer les frappes sur la console caractère par caractère en Java
Comment utiliser la méthode getter / setter (en orientation objet)
Que faire lorsqu'une exception java.io.IOException se produit dans GlassFish
Comment créer une partie d'espace réservé à utiliser dans la clause IN
Créer une méthode pour renvoyer le taux de taxe en Java
Je souhaite utiliser la méthode de désinfection autre que View.
Que faire si la commande rails devient inutilisable
Maquette et stub dans RSpec
Un mémorandum lorsque vous souhaitez voir les données acquises par Jena & SPARQL pour chaque variable.
[Java] Comment rechercher des valeurs dans un tableau (ou une liste) avec la méthode contains
Que faire lorsque vous souhaitez connaître la position source où la méthode est définie dans binding.pry
Si vous souhaitez simplement exécuter vos conteneurs dans le cloud, Azure Container Instances est facile
Que faire si vous obtenez une erreur gcc dans Docker
Utilisez Modifier # isStatic pour déterminer si la méthode [Reflection] est statique.
Si vous souhaitez modifier l'environnement de développement Java d'Eclipse
Pourquoi vous devriez ajouter l'annotation Override lors du remplacement d'une méthode
Comment stocker les informations saisies dans la zone de texte dans une variable de la méthode
Que faire si vous oubliez votre mot de passe root sur CentOS7
Comment utiliser la méthode link_to
Créer une ArrayList qui vous permet de lancer et de récupérer les coordonnées d'un plan bidimensionnel
Comment utiliser la méthode include?
Comment utiliser la méthode form_with
[Pour les débutants] Je souhaite saisir automatiquement des données pré-enregistrées dans le formulaire de saisie avec une commande de sélection.
Que faire si l'opération non autorisée s'affiche lors de l'exécution d'une commande dans le terminal