我使用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方法为我解析了一个新的用户对象,在测试中我创建了第二个,这是绝对不同的对象,但我不确定这个猜想。 你能告诉我怎么修这个吗?
答案 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 :)
});