如何在typescript中测试一个模拟接口

390 阅读1分钟

在本教程中,你学到了如何在typescript中测试一个模拟接口。

Typescript是javascript的高级版本,具有typeafe检查等强大功能。

Jest是一个类似于Facebook的jasmine的单元测试框架。

如何在Jest中模拟一个接口?

让我们在typescript中声明一个接口,接口中使用枚举。

role.ts:

enum ROLE {
    ADMIN,
    SALES,
    FINANCE
}

user.ts:

export interface User {
    id: number;
    name: string;
    role: ROLE.ADMIN | ROLE.FINANCE | ROLE.SALES;
}

这里有一个User.spec.ts,用于模拟接口。

Jest mock interface example:

  • 首先创建一个具有所有定义值的模拟接口
  • 检查模拟对象是否未定义,并断言其值为预期值。
describe('User', () => {
    const mock = jest.fn(() => {
        return {
            id: 1,
            name: 'john',
            role: ROLE.ADMIN,
        };
    });

    it('should check mock object', () => {
        const user = mock();
        expect(user).toBeDefined();

    });
    it('should check properties', () => {
        const user = mock();
        expect(user.name).toEqual('john');
        expect(user.role).toEqual(ROLE.ADMIN);
    });
});

如何模拟一个包含异步承诺的接口?

让我们定义一个有以下方法返回Promise的服务

interface UserService {
    getEmployee: () => Promise
}

下面是一个例子jest async method interface example

以下是创建mock的步骤

  • 首先使用jest.fn创建一个模拟接口,其方法可以解析为一个对象。
  • 下一步是定义模拟对象的断言检查
  • 检查assert对象的promise方法以检查解决的值
let userServiceMock: UserService;

describe('UserService', () => {
    beforeAll(() => {

        userServiceMock.getEmployee = jest.fn(() => Promise.resolve({
            id: 1,
            name: 'john',
            role: ROLE.ADMIN,

        }));
    });



    it('should check mock object', () => {

        expect(userServiceMock).toBeDefined();

    });
    it('should check properties', () => {
        userServiceMock.getEmployee();
        expect(userServiceMock.getEmployee).toHaveBeenCalled();
        expect(userServiceMock.getEmployee.mock.results[0].value).resolves.toBe({
            id: 1,
            name: 'john',
            role: ROLE.ADMIN,

        })
    });
});

总结

你学会了用jest框架在typescript中模拟一个接口,也学会了用异步方法模拟一个接口。