【发布时间】:2018-04-05 19:19:14
【问题描述】:
我正在使用 Jasmine 编写一些测试用例。它看起来像这样:
类定义:
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
getFullName() {
return this.firstName + this.lastName;
}
getName () {
setTimeout(() => {
return this.getFullName();
}, 100)
}
}
module.exports = Person;
测试代码:
const Person = require('./index');
describe('Test Person methods', () => {
beforeEach(() => {
programmer = new Person('John', 'Gray');
spyOn(programmer, 'getFullName');
programmer.getName();
});
it('getName should call getFullName', () => {
expect(programmer.getFullName).toHaveBeenCalled();
})
});
getName 是一个异步函数,它会在一段时间后调用getFullName。由于这种异步特性,it 规范在调用getName 后立即执行,因此测试失败。
我知道可以使用 Jasmine 的done 功能进行异步测试,但是这里不知道如何实现?在文档中,done 方法仅在异步代码中被调用,但测试无法访问该代码,因为它由getName 方法在内部处理。
或者有没有其他不使用done方法的方法?
Here 是此代码的工作示例。
【问题讨论】:
-
你需要调用
done在异步代码被执行,所以你需要改变一个位类Person,以便例如提供一个回调到getName并在异步代码中调用此回调。 -
@Joel:你能用代码展示一下吗?您也可以在我提供的链接中尝试您的方法。
-
请注意,如果有承诺会更好看……也许是口味问题
-
@Joel 您已经修改了“getName”方法。我不能这样做,因为我无法更改正在测试的代码的功能。
标签: javascript jasmine karma-jasmine