如何测试代码块中有WAIT语句的angular异步函数

如何测试代码块中有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();

我试着用karma和jasmine测试一个简单的函数

阶级

测试文件

测试用例中print语句的输出为


如何测试这些函数。

您的测试应该至少由一个期望值组成,否则您测试的不是特定的结果,而是代码运行时没有错误

在您的情况下,我认为您可以将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()
  }));