2017-02-24 3 views
0

Wie kann man Mock eine Dienstprogramm-Methode, die in einer Datei referenziert befindetRubin rspec eine Dienstprogramm Methode spöttischer

require 'myfile.rb' 

Der Inhalt der Datei wie so ist.

public 
def my_method_name(arg1, arg2, arg3) 
{ 
    .... 
} 

Im Moment habe ich so etwas wie:

double("mydouble", "my_method_name" => somehash) 

I Unit-Test dann die Klasse-I-Tests sind, die diese Methode aufruft, aber dies scheint nicht bei allen Verfahren spöttisch zu . Alle Hilfe wird geschätzt

Grundsätzlich die Methode, die ich spotten möchte, tut einige Netzwerkabfrage. Ich möchte nur sagen: Immer wenn diese Methode aufgerufen wird, gebe diesen Hash zurück. Diese Methode gehört nicht zu einer Klasse (oder glaube ich).

+0

Möchten Sie die Methode für alle Instanzen einer Klasse stubben? Können Sie einen Beispielcode mit dem angeben, was Sie erwartet haben? – ndn

+0

Bearbeitete Frage oben. Die Methode, die ich simulieren möchte, wird in der Klasse verwendet, die ich gerade teste. Nicht sicher, ob das durch meine Frage klar war. – user98651

Antwort

1

In Ruby sind alle Methoden zu etwas zugeordnet (Modul oder Klasse). Methoden, die Sie auf der obersten Ebene definieren, werden zu privaten Methoden von Kernel.


x = double("mydouble", "my_method_name" => somehash) 

erfordert das Verfahren nicht my_method_name Stummel. Es erstellt ein Doppel (separates Objekt). Wenn Sie #my_method_name auf sie aufrufen, wird es mit somehash reagieren:

x.my_method_name # => somehash 

Finden Sie das Objekt die Methode aufgerufen auf wird. Wenn es leicht ersetzt werden kann und nicht so viel mehr Funktionen hat, können Sie dieses Double stattdessen auf seinem Platz übergeben. Ist dies nicht der Fall ist, können Sie die Methode für das Objekt Stummel, indem Sie:

said_object.stub(my_method_name: somehash) 

Wenn Sie es für alle Instanzen einer Klasse Stummel möchten, können Sie tun:

TheObjectsClass.any_instance.stub(my_method_name: somehash) 

Disclaimer: Das Thema ist ein bisschen komplexer und Gegenstand der Debatte. Betrachten Sie dies nicht als eine gute Testpraxis, es zielt nur darauf ab, Ihnen zu helfen, zu verstehen, wie Sie rspec verwenden.


Sie sagten, dass dies mit Netzwerken zusammenhängt. Sie können die Verwendung von VCR zur Simulation tatsächlicher Anforderungen in Betracht ziehen.

0

Da die Klasse, die Sie testen, die man auf dem diese Methode aufgerufen wird, sollten Sie die Methode auf der gleichen Klasse

allow(<your_class_instance>).to receive(:my_method_name).and_return(<>) 

ich diese Methode gehe davon aus, eine Instanz Methode werden Anstoßen. Wenn es eine Klassenmethode ist, müssen Sie es auf Klassenebene stubben