【问题标题】:Sinon spy calledWithNew not working名为WithNew的Sinon间谍不起作用
【发布时间】:2018-08-16 19:54:03
【问题描述】:

我正在尝试使用 sinon 或 sinon-chai 的 calledWithNew(或简称为),但似乎无法使其正常工作,我在网上查看了一些建议也没有运气,这是我的功能正在尝试测试:

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
});

我发现了几篇建议监视 (window, 'className') 的帖子,但我使用的是 mocha,而不是浏览器。

尝试监视(全局、用户/用户.原型)也没有奏效。

【问题讨论】:

    标签: node.js unit-testing mocha.js sinon spy


    【解决方案1】:

    Userusers.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。 :\ 不过,这取决于你。

    【讨论】:

      猜你喜欢
      • 2018-12-26
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多