使用ts-mockito的摩卡测试代码无法正常工作

时间:2019-02-01 06:20:48

标签: node.js mockito mocha chai

mocha + chai + ts-mockito正在执行node.js应用程序的单元测试。 为了测试Service类,我们模拟了Repository类的方法,该方法在Service类中被调用。 运行无法按预期进行。

我期望有ErrorDto,但是将返回字符串“ TypeError:无法读取null的'then'属性”。

请告诉我出问题了。

测试代码。

let mockedRepository: MyRepository = tsmockito.mock(MyRepository);

describe("MyService Test", () => {

    it("getAll() test", async () => {

        const errorDto = new ErrorDto();
        errorDto.addMessage("test message");

        tsmockito.when(mockedRepository.getAll()).thenCall(() => {
            return new Promise((resolve, reject) => {
                reject(errorDto);
            });
        });

        let mockedRepositoryInstance: MyRepository = tsmockito.instance(mockedRepository);
        Container.set(MyRepository, mockedRepositoryInstance);
        let service = new MyService();

        let res = await service.getAll();
        // I expect ErrorDto for res,
        // but "TypeError: Can not read property 'then' of null" is returned.

        if (res instanceof ErrorDto) {
            // Do not reach below
            let msg = res.getMessages();
            expect(msg[0]).to.eql("test message");
        } else {
            // Test failure
            expect(true).to.false;
        }
    });
});

要测试的服务类别

@Service()
export default class MyService {

    @Log()
    public getAll() {
        const repository = Container.get(MyRepository);
        return new Promise<MyServiceTreeDto[]>((resolve, reject) => {
            repository.getAll()
                .then((res: MyTreeDomain[]) => {
                    const resDto = new Array<MyServiceTreeDto>();
                    //do something...
                    resolve(resDto);
                }).catch((err) => {
                    reject(err);
                });
        });
    }
}

要模拟的存储库类

@Service()
export default class MyRepository {

    public async getAll(domain: MyDomain): Promise<MyTreeDomain[]> {
        try {
            let res: MyTreeDomain[] = new Array<MyTreeDomain>();
            //do async process
            return res;
        } catch (err) {
            if (err instanceof ErrorDto) {
                throw err;
            } else {
                const errorDto = new ErrorDto();
                errorDto.addMessage("error!");
                throw errorDto;
            }
        }
    }
}

0 个答案:

没有答案