Jest.js 测试函数不能同时接受“done”回调

yvt65v4c  于 2022-12-08  发布在  Jest
关注(0)|答案(6)|浏览(256)

我尝试使用nestjs创建一个简单的测试,但遇到以下错误
测试函数不能同时接受“done”回调并返回某些内容。请使用“done”回调或返回承诺。
返回值:承诺{}
单元测试是如此简单,但是当我使用done()时,我得到一个错误;

it('throws an error if a user signs up with an email that is in use', async (done) => {
fakeUsersService.find = () => Promise.resolve([{ id: 1, email: 'a', password: '1' } as User]);
try {
  await service.signup('asdf@asdf.com', 'asdf');
} catch (err) {
  done();
}
});
ddarikpa

ddarikpa1#

您正在合并“异步/等待”和“完成”。
使用asnyc/await或done。

it('throws an error if user signs up with email that is in use', async () => {
    try {
        await service();
        expect(...);
    } catch (err) {
    }
});

或使用done格式

it('throws an error if user signs up with email that is in use', (done) => {
    ...
    service()
     .then( ...) {}
     .catch( ...) {}
    }
    done();
});
qc6wkl3g

qc6wkl3g2#

对于jest的最后一个版本,你不能同时使用'async/await,promise和done。
其解决方案是

it("throws an error if user sings up with email that is in use", async () => {
    fakeUsersService.find = () =>
      Promise.resolve([{ id: 1, email: "a", password: "1" } as User]);
    await expect(service.signup("asdf@asdf.com", "asdf")).rejects.toThrow(
      BadRequestException
    );
  });

根据侦听异常更改BadRequestException

jv4diomz

jv4diomz3#

在v27之前,jest默认使用jest-jasmine 2。
对于版本27,jest使用jest-circus,它不支持done回调。
因此需要更改默认的testRunner。
用react-app-rewired覆盖对我很有效

// config-overrides.js
module.exports.jest = (config) => {
    config.testRunner = 'jest-jasmine2';
    return config;
};
6ioyuze2

6ioyuze24#

此外,如果您想同时使用这两个版本,可以将jest的当前版本降级为:26.6.3.对我来说很好,我使用的是async + done

laximzn5

laximzn55#

对于jest的最后一个版本,你不能同时使用'async/await,promise和done(* 测试函数不能同时接受'done'回调和返回一些东西。要么使用'done'回调,要么返回promise。*)
其解决方案是

  • 用户.实体.ts*
import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  AfterInsert,
  AfterRemove,
  AfterUpdate,
} from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  email: string;

  @Column()

  password: string;

  @AfterInsert()
  logInsert() {
    console.log('Inserted User with id', this.id);
  }

  @AfterUpdate()
  logUpdate() {
    console.log('Updated User with id', this.id);
  }

  @AfterRemove()
  logRemove() {
    console.log('Removed User with id', this.id);
  }
}
  • 验证服务规范ts*
it('throws an error if user signs up with email that is in use', async () => {
    fakeUsersService.find = () =>
      Promise.resolve([{ id: 1, email: 'typescript@nestjs.jestjs', password: '1' } as User]);

    expect(async () => {
      const email = 'asdf@asdf.com';
      const password = 'asdf';
      await service.signup(email, password);
    }).rejects.toThrow(BadRequestException);
  });
kxe2p93d

kxe2p93d6#

it('throws an error if a user signs up with an email that is in use', async () => {
    await service.signup('asdf@asdf.com', 'asdf');
    try {
     await service.signup('asdf@asdf.com', 'asdf');
    } catch (e) {
      expect(e.toString()).toMatch('email in use');
    }
  });

相关问题