如何测试代码块中有WAIT语句的angular异步函数
我试着用karma和jasmine测试一个简单的函数 阶级 测试文件 测试用例中print语句的输出为如何测试代码块中有WAIT语句的angular异步函数,angular,unit-testing,rxjs,karma-jasmine,Angular,Unit Testing,Rxjs,Karma Jasmine,我试着用karma和jasmine测试一个简单的函数 阶级 测试文件 测试用例中print语句的输出为 如何测试这些函数。您的测试应该至少由一个期望值组成,否则您测试的不是特定的结果,而是代码运行时没有错误 在您的情况下,我认为您可以将spy存储为常量,然后期望它在勾选后被调用,如下所示: describe("Hello world", () => { it("test the async", fakeAsync(() => { const t = new Acl();
如何测试这些函数。您的测试应该至少由一个期望值组成,否则您测试的不是特定的结果,而是代码运行时没有错误 在您的情况下,我认为您可以将spy存储为常量,然后期望它在
勾选
后被调用,如下所示:
describe("Hello world", () => {
it("test the async", fakeAsync(() => {
const t = new Acl();
const spy = spyOn(t, "callMe").and.returnValue(
new Observable((observer) => observer.next({ something: "key" }))
);
t.caller();
tick();
expect(spy).toHaveBeenCalled()
}));
});
另一个答案中显示的测试写得正确,应该可以运行--
expect
语句应该启动并通过
如果它没有通过,可能是因为。如果您的测试以本机async/await
(目标ES2017或更高版本)运行,Zone无法钩住await
语句,因此tick()
将不会导致它继续运行。您可以通过在await
行和tick()
行前后放置日志语句来测试这一点:
async caller() {
console.log("before await");
const calledMe = await this.callMe().toPromise();
console.log("after await");
return calledMe;
}
// ...
it("test the async", fakeAsync(() => {
const t = new Acl();
const spy = spyOn(t, "callMe").and.returnValue(
new Observable((observer) => observer.next({ something: "key" }))
);
t.caller();
console.log("before tick");
tick();
console.log("after tick");
expect(spy).toHaveBeenCalled()
}));
如果您在tsconfig中使用目标:“es2015”运行此测试,您应该看到“等待前”、“勾选前”、“等待后”、“勾选后”,那么您的测试应该通过。如果您使用目标:“es2017”
或更高版本运行它,如2018/2020/esnext,您应该看到“等待前”、“勾选前”、“勾选后”,那么您的测试应该失败,那么“等待后”可能会在测试体函数完全执行完毕后记录
顺便说一句,这让我疯狂了大约两天。
ng
CLI的用户在试图通过es2015
时会收到警告,但如果您直接使用AngularCompilerPlugin
webpack插件编译项目,则不会收到警告。如果我添加期望值,事情将保持不变。等待之后的语句不会执行。我需要在等待调用之后测试语句。我添加的代码是我正在尝试的简化版本。
describe("Hello world", () => {
it("test the async", fakeAsync(() => {
const t = new Acl();
const spy = spyOn(t, "callMe").and.returnValue(
new Observable((observer) => observer.next({ something: "key" }))
);
t.caller();
tick();
expect(spy).toHaveBeenCalled()
}));
});
async caller() {
console.log("before await");
const calledMe = await this.callMe().toPromise();
console.log("after await");
return calledMe;
}
// ...
it("test the async", fakeAsync(() => {
const t = new Acl();
const spy = spyOn(t, "callMe").and.returnValue(
new Observable((observer) => observer.next({ something: "key" }))
);
t.caller();
console.log("before tick");
tick();
console.log("after tick");
expect(spy).toHaveBeenCalled()
}));