间谍方法来自动态获取的对象

时间:2017-09-02 23:23:24

标签: javascript node.js mongoose jasmine spy

我使用mongoose并且我有登录功能,试图找到用户然后验证他的密码(我不会在这里描述这个功能的所有逻辑,但只是主要部分向你展示我的问题)。

function login(req, res) {
   ...
   User.findOne(...)
       .then((user) => {
           user.validPassword(...);
           ...
       });
}

我已经定义了一个包含validPassword方法的用户模型,并且所有工作正常,但是我无法监视validPassword方法。

我使用Jasmine进行测试,并尝试以这种方式执行此操作:

const user = new User(...);
spyOn(user, 'validPassword').and.callThrough();

expect(user.validPassword).toHaveBeenCalled(); // was never called :(

当然我调用了登录功能。当我以这种方式测试findOne方法时,它工作正常,但它更简单,因为我从User构造函数调用方法:

spyOn(User, 'findOne').and.callThrough();

expect(User.findOne).toHaveBeenCalled(); // this works fine!

我认为我的问题与不同的实例有关,因为findOne方法为我解析了一个新的用户对象,在测试中我创建了第二个,这是绝对不同的对象,但我不确定这个猜想。 你能告诉我怎么修这个吗?

1 个答案:

答案 0 :(得分:0)

好的我修好了。

1)我找到了问题的解决方案here

2)我注意到findOne方法返回promise,然后我执行异步任务,所以我必须检查它' done'开始测试前的功能。

function login(req, res) {
   ...
   return User.findOne(...)
       .then((user) => {
           user.validPassword(...);
           ...
       });
}

茉莉花:

beforeAll((done) => {
    spyOn(User.prototype, 'validPassword').and.callThrough();

    login(...).then(() => done());
}

it('calls validPassword', () => {
    expect(User.prototype.validPassword).toHaveBeenCalled(); // works :)
});