Sinon.Stub-Knoten im AWS-SDK
Bin ich zu schreiben versucht, einige der Testabdeckung für eine app, die verwendet das aws-sdk
NPM-Modul, treibt die Dinge bis zu einer SQS-Warteschlange, aber ich bin nicht sicher, wie Sie zu verspotten, die Dinge richtig.
Hier ist mein test bisher:
var request = require('superagent'),
expect = require('chai').expect,
assert = require('chai').assert,
sinon = require('sinon'),
AWS = require('aws-sdk'),
app = require("../../../../app");
describe("Activities", function () {
describe("POST /activities", function () {
beforeEach(function(done) {
sinon.stub(AWS.SQS.prototype, 'sendMessage');
done();
});
afterEach(function(done) {
AWS.SQS.prototype.sendMessage.restore();
done();
});
it("should call SQS successfully", function (done) {
var body = {
"custom_activity_node_id" : "1562",
"campaign_id" : "318"
};
reqest
.post('/v1/user/123/custom_activity')
.send(body)
.set('Content-Type', 'application/json')
.end(function(err, res) {
expect(res.status).to.equal(200)
assert(AWS.SQS.sendMessage.calledOnce);
assert(AWS.SQS.sendMessage.calledWith(body));
});
});
});
});
Den Fehler, den ich sehe, ist:
1) Activities POST /activities "before each" hook:
TypeError: Attempted to wrap undefined property sendMessage as function
2) Activities POST /activities "after each" hook:
TypeError: Cannot call method 'restore' of undefined
Ich bin ein bisschen ein newb, wenn es um sinon.stub
oder Verspottung Objekte in JavaScript, also bitte entschuldigt meine Unwissenheit,
- Haben Sie es geschafft, eine Lösung zu finden, um diese noch?
- gesehen/ausprobiert aws-sdk-mock npm-Modul ? (siehe Antwort unten)
- zu der Zeit habe ich es geschafft stub des service mit proxyquire und sinon und habe es funktioniert. Ich hatte noch nicht einen Blick auf die aws-sdk-mock noch. Haben Sie es verwendet?
- ja, wir sind mit aws-sdk-mock (vereinfacht die
Sinon.Stub
) 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben wir einen aws-sdk-mock npm-Modul, das spottet aus allen AWS-SDK-Dienste und-Methoden. https://github.com/dwyl/aws-sdk-mock
Es ist wirklich einfach zu bedienen. Einfach anrufen AWS.mock mit der service-Methode und eine stub-Funktion.
Dann wieder die Methoden, nachdem Sie Ihre tests durch aufrufen:
Dies ist, wie ich die stub AWS-SDK mit sinonjs
Grundsätzlich habe ich alle Methoden aus der main SQS. Hoffe, dies hilft jemand
Können Sie stub die AWS-SDK-Methoden mit Sinon mit den folgenden
Wickeln Sie das AWS SDK-Instanz und lassen die dies extern:
Bei der Verwendung der
sqsClient
, stellen Sie sicher, dass Sie die verpackte Instanz statt.So ändern Sie Ihre test-Fall von oben, mit dem gewickelt AWS SDK:
Ich denke, das Problem ist, dass das AWS-SDK-Klassen dynamisch erstellt werden, die aus JSON-Konfiguration. Hier ist die eine, die für SQS: Github.
Alle API-Aufrufe schließlich machen, um
makeRequest
odermakeUnauthenticatedRequest
auf Service, so dass ich nur gekürzte diejenigen, die sich mitwithArgs(...)
. Zum Beispiel:arbeitete, in Ordnung für meinen einfachen Anwendungsfall.
Können Sie es tun, ohne damit in irgendeiner extra-Bibliotheken mit so etwas wie dieses:
sinon.stub(AWS, 'Kinesis').returns({ putRecord: sinon.stub().callsArgWith(1, null, true) })
Kann ich Ihnen nicht genau sagen, warum es nicht möglich ist, mit Sinon zu stub das aws sdk (vielleicht einige JS-Experte kann das erklären besser), aber es funktioniert mit proxyquire sehr gut.
Ich wie zu verwenden verspricht, aufbauend auf @kdlcruz Antwort oben, ich habe etwas wie das hier tun: