使用 proxyquire 进行存根 [英] Stubbing with proxyquire
问题描述
我将如何使用 proxyquire 和 sinon 存根以下模块:
How would I stub the following module with proxyquire and sinon:
var email = require("emailjs").server.connect.send();
我执行了以下操作,但它不起作用,因为当我尝试在 send()
中触发错误时,它仍会发送电子邮件.
I did the following, but its not working, because when I try to trigger an error within send()
it still sends the email.
sendMailStub = sinon.stub(email, "send");
testedModule = proxyquire('../index.js', {
'email': {
'server': {
'send': sendMailStub
}
}
});
也试过了:
testedModule = proxyquire('../index.js', {
email: {send: sendMailStub}
});
这是迄今为止的完整测试,失败了:
This is the full test so far, which fails:
var chai = require('chai');
var sinonChai = require("sinon-chai");
var sinon = require('sinon');
chai.use(sinonChai);
var proxyquire = require('proxyquire');
var testedModule;
var expect = chai.expect;
describe('invoicer', function () {
var nock = require('nock');
var ResponseOptions = {
username: "Peter Pan",
user_address_line_1: "Never Never Land",
user_address_line_2: "Tree-house 99",
user_post_code: "E4 9BY",
delivery_address_line_1: "Hook's Boat",
delivery_address_line_2: "Dock 69",
delivery_post_code: "SE2 4C",
order_number: "234234234",
order_date: "20/12/2090",
dispatch_date: "20/12/2090",
items: [
{
product_name: "Fairy Dust",
brand: "Airy fairy",
quantity: 5,
total: 2000
},
{
product_name: "Pirate Sword",
brand: "Pirate's Bay",
quantity: 8,
total: 2000
}
],
grand_total: 4000,
user_email: "peter@flyaway.com"
}
var mailOptions = {
text: "Hello World"
}
var scope = nock("http://somewhere.com")
.get("/orders")
.reply(200, ResponseOptions);
var sendStub, readFileStub, url, contextDoneSpy, obj, connectStub;
before(function () {
readFileStub = sinon.stub();
sendStub = sinon.stub().withArgs(mailOptions).callsArgWith(1, null, contextDoneSpy);
connectStub = sinon.stub().returns({
send: sendStub
});
testedModule = proxyquire('../index', {
'fs': {readFile: readFileStub},
'emailjs': {
'server': {
'connect': connectStub
}
}
});
url = "http://somewhere.com/orders";
contextDoneSpy = sinon.spy();
obj = {
user: 'AKIAJMHSJRRYGKTE4TOQ',
password: 'Ag3Nkpej8dxZ4DwYz2in/x8kUhN7Lh/BqXImB0+i+DWy',
host: "email-smtp.eu-west-1.amazonaws.com",
port: 587,
tls: true,
ssl: false
}
readFileStub.withArgs('./email.html').callsArgWith(1, null, 'file1');
connectStub();
});
it("readFile and successful context.done were called", function (done) {
testedModule.Invoicer(url, obj, { done: function () {
contextDoneSpy.apply(null, arguments);
expect(readFileStub).has.been.called;
expect(contextDoneSpy).to.have.been.called;
done();
}});
});
});
推荐答案
让我们首先使用 文档
require("emailjs").server.connect({
/* Required server options */
}).send(function (err, message) {
// This a function with a callback node convention signature
});
connect
是一个函数,应该接收一些参数,而且 send
不返回任何东西,基本上是调用回调
connect
is a function and should receive some parameters, moreover send
doesn't return any thing, basically call a callback
Proxyquire 需要使用相同的模块名称,所以 email
应该是 emailjs
,另一方面你在 proxiquire中分配存根是错误的代码>,应该是
Proxyquire requires to use the same module name, so email
should be emailjs
, on the other hand you're wrong assigning the stub in proxiquire
, it should be
connectStub = sinon.stub().returns(sendStub);
sendMailStub = sinon.stub(email, "send");
testedModule = proxyquire('../index.js', {
'emailjs': {
'server': {
'connect': connectStub
}
});
这篇关于使用 proxyquire 进行存根的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!