[RUBY] Wenn Sie eine Methode in RSpec verspotten möchten, sollten Sie die Methode allow für mock und die Singleton-Methode verwenden.

Überblick

In rspec möchten Sie häufig eine Methode verspotten, um das Testen zu vereinfachen.

Im folgenden Beispiel wird die Methode "admin?" Von der Methode "set_complex_config" beeinflusst.

Die Methode set_complex_config hat bereits einen eigenen Testcode und Sie möchten nur die Antwort.

#Codebeispiel ist angemessen
class User
  def admin?
    res = set_complex_config
    case res
    when 'hoge'
      'hoge'
    when 'fuga'
      'fuga'
    end
  end

  def set_complex_config
    #Komplexe Verarbeitung
  end
end

Ich kann mir zwei Möglichkeiten vorstellen, mich in einem solchen Fall zu verspotten, also habe ich mir überlegt, welche besser ist.

Wie man verspottet

① Definieren Sie eine Singleton-Methode und verspotten Sie

So überschreiben Sie die set_complex_config-Methode der User-Klasse mit der Singleton-Methode (siehe unten).

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 =>Bewegung

  user.define_singleton_method(:set_complex_config) { hoge_let }
  user.set_complex_config => wrong number of arguments (given 0, expected 2..3)
end

Auf den ersten Blick sieht es cool aus, aber in diesem Fall kann der Block der Methode define_singleton_method im Beispiel oder vor dem Block die Variable let nicht lesen.

② Verspotten mit der Zulassungsmethode

Die Methode allow funktioniert einwandfrei.

let(:hoge_let) { 'hoge' }
it do
  user = create(:user)
  allow(user).to receive(:attributes).and_return(hoge_let)
  user.set_complex_config =>Bewegung
end

Fazit

Es scheint besser zu sein, allow (). To Receive (). And_return () gehorsam zu verwenden.

Recommended Posts

Wenn Sie eine Methode in RSpec verspotten möchten, sollten Sie die Methode allow für mock und die Singleton-Methode verwenden.
Wenn Sie die Methode außerhalb verwenden möchten
Möglicherweise möchten Sie die Methode remove in ArrayList nicht sehr oft verwenden
Ich möchte eine Methode aufrufen und die Nummer zählen
Wenn Sie die übergeordnete Klasse in Lomboks @builder aufnehmen möchten
[Swift] Wenn Sie wissen möchten, ob die Anzahl der Zeichen in String mit einer bestimmten Anzahl übereinstimmt ...
[Für Super-Anfänger] Das Mindestwissen, das Sie mit Hashes und Symbolen berücksichtigen möchten
So testen Sie eine private Methode und verspotten sie teilweise in Java
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
[RSpec] Wenn Sie die Instanzvariable des Controllers im Test verwenden möchten [Zuweisungen wird nicht empfohlen]
Wenn Sie die Testabdeckung privater Methoden in JUnit erfüllen möchten
Wenn Sie Android Room verwenden und die Spaltendefinition ändern möchten
Ich möchte, dass Sie Scala vorerst als besseres Java verwenden
Verwenden Sie doch die for-Anweisung? Verwenden Sie die while-Anweisung? Ordnungsgemäße Verwendung von for-Anweisung und while-Anweisung
Für diejenigen, die MySQL für die Datenbank in der Umgebungskonstruktion von Rails6 ~ verwenden möchten.
Ich möchte ein kleines Symbol in Rails verwenden
Wenn Sie Mockito mit Kotlin verwenden möchten, verwenden Sie Mockito-Kotlin
So verspotten Sie einen Super-Methodenaufruf in PowerMock
Ich möchte PowerMock in einer Klasse verwenden, die parametrisierte Tests und gewöhnliche Tests kombiniert
Ich möchte in RSpec auf einen GoogleMap-Pin klicken
Verwenden Sie die binäre Suche, um festzustellen, ob das Array Werte enthält
Wenn in Ruby Hash [: a] [: b] [: c] = 0 ist, möchten wir, dass Sie rekursiv erweitern, auch wenn der Schlüssel nicht vorhanden ist
Was tun, wenn Sie in Eclipse eine JRE auswählen und "Die ausgewählte JRE unterstützt die aktuelle Konformitätsstufe 11 nicht" erhalten?
Wenn Sie eine Java-Anwendung in ein Docker-Image verwandeln möchten, ist es praktisch, Jib zu verwenden.
Verwenden Sie JLine, wenn Sie Tastenanschläge auf der Konsole zeichenweise in Java verarbeiten möchten
Verwendung der Getter / Setter-Methode (in Objektorientierung)
Was tun, wenn in GlassFish eine java.io.IOException auftritt?
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
Ich möchte eine andere Desinfektionsmethode als Ansicht verwenden.
Was tun, wenn der Befehl Rails unbrauchbar wird?
Mock and Stub in RSpec
Ein Memorandum, wenn Sie die von Jena & SPARQL erfassten Daten für jede Variable anzeigen möchten.
[Java] So suchen Sie mit der Methode includes nach Werten in einem Array (oder einer Liste)
Was tun, wenn Sie die Quellposition wissen möchten, an der die Methode in bind.pry definiert ist?
Wenn Sie Ihre Container nur in der Cloud ausführen möchten, ist Azure Container Instances ganz einfach
Was tun, wenn in Docker ein gcc-Fehler auftritt?
Verwenden Sie den Modifikator # isStatic, um festzustellen, ob die Methode [Reflection] statisch ist.
Wenn Sie die Java-Entwicklungsumgebung von Eclipse aus ändern möchten
Warum Sie die Überschreibungsanmerkung hinzufügen sollten, wenn Sie eine Methode überschreiben
Speichern der im Textbereich eingegebenen Informationen in einer Variablen in der Methode
Was tun, wenn Sie Ihr Root-Passwort unter CentOS7 vergessen haben?
Verwendung der link_to-Methode
Erstellen einer ArrayList, mit der Sie die Koordinaten einer zweidimensionalen Ebene eingeben und abrufen können
Verwendung der include? -Methode
Verwendung der Methode form_with
[Für Anfänger] Ich möchte mit einem Auswahlbefehl automatisch vorregistrierte Daten in das Eingabeformular eingeben.
Was tun, wenn der Vorgang nicht zulässig ist, wenn ein Befehl im Terminal ausgeführt wird?