Anfrage-Stub mit Sinon in Mokka erstellen
Frage
Ich benutze mocha
Um einige Klassen zu testen, muss ich einen Stub davon erstellen request
Bibliothek.
Ich benutze sinon
, und ich kann einen Stub davon erstellen request.get
Methode, aber ich kann keinen Stub davon erstellen request
Methode (die http-Aufrufe versuchen, eine Verbindung zu einem Server herzustellen).Wie ich gelesen habe, request.get
ist ein Alias für request
aber wenn ich stoße request.get
es hat keine Auswirkung darüber request
Anrufe.
Dieser Code funktioniert (mit request.get
):
In Tests:
request = require 'request'
describe "User test", ->
user = {}
before (done) ->
user = new test.user('Ander', 18)
sinon.stub(request, 'get').yields(null, {statusCode: 200}, 'foo')
done()
after (done) ->
request.get.restore()
done()
it "testing server response", ->
user.getData().should.equal 'ander'
In der Quelle:
request = require 'request'
class User
contructor(@name, @age): ->
getData: ->
mydata = ''
request.get 'http://127.0.0.1:8080/', (err, response, body) ->
if not err and response.statusCode == 200
mydata = body
else
err = throw new Error "Errorea"
mydata
Dies funktioniert jedoch nicht (versucht, eine Verbindung zur angegebenen URL herzustellen):
In Tests:
request = require 'request'
describe "User test", ->
user = {}
before (done) ->
user = new test.user('Ander', 18)
sinon.stub(request, 'Request').yields(null, {statusCode: 200}, 'foo')
#Creating the stub this way, doesn't work neither
#sinon.stub(request, 'get').yields(null, {statusCode: 200}, 'foo')
done()
after (done) ->
request.Request.restore()
done()
it "testing server response", ->
user.getData().should.equal 'ander'
In der Quelle:
request = require 'request'
class User
contructor(@name, @age): ->
getData: ->
mydata = ''
request 'http://127.0.0.1:8080/', (err, response, body) ->
if not err and response.statusCode == 200
mydata = body
else
err = throw new Error "Errorea"
mydata
Welches ist der richtige Weg, um einen Stub zu erstellen? request
Anruf?Mit welcher Methode soll gestubt werden?
Lösung
Obwohl request
ist eine großartige Bibliothek, aber kein gutes Beispiel für eine gut strukturierte API.Und weil Modul request
ist als Funktion mit zusätzlichen Methoden definiert (ähnlich wie express
), da Sie meines Wissens keinen Stub für eine Funktion erstellen können request
mit sinon
.
Das Beste, was Sie tun können, ist, die Verwendung zu vermeiden request
Funktion in Ihrem Code und nur zur Verwendung request.get
, request.post
, usw., die Sie leicht löschen können.
Stub erstellen für Request
in Ihrem zweiten Beispiel hilft das nicht, weil Request keine Methode ist, siehe Quellcode.
Andere Tipps
Wenn jemand immer noch nach einer Antwort sucht, sieht es aus, als könnten Sie einen Stub für Anforderung mit SINON erstellen:
Weitere Details finden Sie in hier
Eine andere Problemumgehung würde einen Stub mit sinon module erstellen und die anforderung abhängigkeit im entsprechenden Modul kann mit proxyquire überschrieben werden.
generasacodicetagpre.Weitere Informationen finden Sie unter Dieser Artikel über Untertests mit Mocks in Knoten
in einer der Antworten auf die Frage Wie schütteln Sie die Anforderung und Antwort in Nodejs, um Middleware / Controller zu testen? , das Paket -Knoten-Mocks-http bietet einen Weg, um Anforderungs- und Antwortspott zu erstellen.