所以我使用 Chai、rewire、sinon 和 sinon-chai 的测试套件来测试一些 Node javascript。这是我第一次尝试进行设置,因此我可以使用一些指针。我试图测试的函数如下所示:
UserRoles.get = function(ccUrl, namespace, environment, ccToken, authPath) {
var crowdControl = new CrowdControl(ccUrl, namespace, environment, ccToken, authPath);
return q.Promise(function(resolve, reject) {
crowdControl.get().then(resolve).fail(reject).done();
});
};
在导出为 UserRoles 的文档内。所以我的初始设置工作正常,我遇到的麻烦是模拟测试这个功能。我正在尝试模拟新的 CrowdContol 部分,因此我的尝试如下所示:https://jsfiddle.net/d5dczyuk/ .
所以我正在尝试
testHelpers.sinon.stub(CrowdControl, "UserRoles");
拦截并 stub
var CrowdControl = require('./crowdcontrol');
然后运行
userRoles.get;
console.log(CrowdControl);
似乎 stub 没有被调用(它记录它是一个 stub ,但没有被调用)。我还希望也需要 stub crowdControl.get(),但是我试图首先让这个简单的部分工作。不知道我需要做些什么不同的事情才能让它在这里工作。这是我第一次在 Node 中进行单元测试,我已经在 Angular 中做了很多工作,我可以“模拟”CrowdControl,但我不确定它在 Node 中是如何工作的。
为了澄清,我只是检查 CrowControl 是否会被传入的变量调用,我应该 stub 它吗?但我也想模拟crowdControl,这样我就可以强制获取返回的内容。
编辑:这是我的第二次尝试:https://jsfiddle.net/5m5jwk5q/
最佳答案
我喜欢使用proxyquire对于这种测试。使用 proxyquire,您可以从您尝试测试的模块中删除所需的依赖项。所以在你的情况下你可以这样做:
var crowdControlSpy = sinon.spy();
// Makes sure that when ./user-roles tries to require ./crowdcontrol
// our controlled spy is passed, instead of the actual module.
var UserRoles = proxyquire('./user-roles', {
'./crowdcontrol': crowdControlSpy
});
UserRoles.get(...);
expect(crowdControlSpy).to.have.been.called;
关于javascript - 使用 sinon 进行 Node 、单元测试和模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29946121/