Sinon间谍叫做NewNew不工作

时间:2018-03-08 12:47:07

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

我试图使用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)也不起作用。

1 个答案:

答案 0 :(得分:0)

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。但是,它取决于你。