我试图使用sinon或sinon-chai的名字叫做NewNew(或简单地叫做),但似乎无法让它工作,我已经看了一些建议在线没有运气,这是我尝试测试的功能:
users.js
exports.create = function (data) {
//some validation
var user = new User(data);
return user.save().then((result) => {
return mailer.sendWelcomeEmail(data.email, data.name).then(() => {
return {
message: 'User created',
userId: result.id
};
});
}).catch((err) => {
return Promise.reject(err);
});
}
这是我的测试:
users.test.js
beforeEach(() => {
saveStub = sandbox.stub(User.prototype, 'save').resolves(sampleUser);
spy = sandbox.spy(User);
});
afterEach(() => {
sandbox.restore();
});
it('should call user.save', async () => {
result = await users.create(sampleArgs);
expect(saveStub).to.have.been.called; //-> true
expect(spy).to.have.been.called; //-> false, calledWithNew returns same result as well
});
我发现有几个帖子暗示了间谍(窗口,' className')但我使用的是mocha,而不是浏览器。
试图窥探(global,User / User.prototype)也不起作用。
答案 0 :(得分:0)
User
是users.js
中的模块级变量。诗乃不能影响它。在测试文件中执行此操作时:
spy = sandbox.spy(User);
您确实在测试文件的范围内创建了间谍,但您的模块仍在使用原始版本。
要做这样的事情,你需要在一个对象中导出你的构造函数,然后调用它并通过该对象监视它:
User
来自哪里,让我们说user.js:
class User {
// whatever your User implementation is
}
module.exports = { User };
users.js:
const userModule = require('./user');
...
var user = new userModule.User(data);
然后,在您的测试文件中:
const userModule = require('./user');
spy = sandbox.spy(userModule, 'User');
另一种方法是使用proxyquire之类的东西。它可以使这些类型的测试不那么突兀,但可以使你的测试更容易让读者感到困惑。
我的偏好通常是让施工人员非常简单,所以我不必再监视他们。因为这个原因,我从未在我自己的任何项目中使用calledWithNew
。但是,它取决于你。