【问题标题】:node, unit-testing and mocking with sinon使用 sinon 进行节点、单元测试和模拟
【发布时间】:2015-04-29 14:04:33
【问题描述】:

所以我正在使用 Chai、rewire、sinon 和 sinon-chai 的测试套件来测试一些节点 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");

拦截和存根

var CrowdControl = require('./crowdcontrol');

然后运行

userRoles.get;

console.log(CrowdControl);

而且似乎没有调用存根(它记录了它是一个存根,但没有记录它已被调用)。我还需要对 crowdControl.get() 进行存根,但是我试图让这个简单的部分首先工作。不知道我需要做些什么不同才能让它在这里工作。这是我第一次在 node 中进行单元测试,我在 angular 中做了一堆我可以“模拟”CrowdControl,但我不确定它在 node 中是如何工作的。

只是为了澄清我只是在检查是否会在传入这些变量的情况下调用 CrowControl,我应该只存根它吗?但我也想模拟 crowdControl 以便我可以强制 get 返回。

编辑:这是我的第二次尝试:https://jsfiddle.net/5m5jwk5q/

【问题讨论】:

    标签: javascript angularjs node.js unit-testing


    【解决方案1】:

    我喜欢使用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;
    

    【讨论】:

      猜你喜欢
      • 2015-03-01
      • 2016-11-06
      • 1970-01-01
      • 2017-04-26
      • 2023-04-01
      • 2021-03-15
      • 1970-01-01
      • 2021-09-27
      • 2023-04-09
      相关资源
      最近更新 更多