如何在typescript中对模型接口进行单元测试?

jm2pwxwz  于 2023-05-08  发布在  TypeScript
关注(0)|答案(3)|浏览(154)
export interface User {
    name: string;
}

我如何对上述接口进行单元测试,以便Karma可以在代码覆盖率报告中显示它?
我已经尝试创建对象并Assert一些属性,但没有成功。测试通过了,但是karma没有在代码覆盖率报告中考虑它。

import { User } from "./user";

describe('User', () => {

    it('test', () => {
        const obj: User = {
            name: "xxx",

        }
        expect(obj.name).toEqual("xxx");
    });

});
cyvaqqii

cyvaqqii1#

你不能。这里没有代码可以解释:没有什么是可执行的。
而接口只存在于编译时。它们在运行时不存在。

q5lcpyga

q5lcpyga2#

对于将来有类似问题的用户,我提出了以下用于测试接口的系统(我只对特别古怪的接口使用,比如我自动生成的那些)。这绝对是一个解决方法,但是如果没有适当地指定接口,它确实会使我的构建失败。
首先,在“测试”中,将具有预期字段和类型的对象强制转换到接口中。比如说

interface MyInterface = { 
  id: number;
  createTime: Date;
}

test("MyInterface should have appropriate fields and types", () => {
  ({
    id: 3,
    createTime: new Date(),
  } as MyInterface);
})

然后,我添加了一个编译TypeScript的构建步骤,如果MyInterface被更改,它将出错。

tsc --noEmit

再次重申:我的测试中没有Assert,所以它们不是真实的的单元测试,这是一个解决方案。但是这个过程已经提醒我注意了几次问题,所以它达到了目的。

nuypyhwy

nuypyhwy3#

我的回答详细说明了@JB_Nizet的。
您不能对报告进行测试覆盖,但有替代方案:

**1.将你的接口放在一个单独的文件中,并指定在创建覆盖率报告时忽略它。**例如,我使用代码测试覆盖率报告的伊斯坦布尔库,它提供了忽略文件。为了使文件被忽略,在其中指定以下内容就足够了:

/* istanbul ignore file */

**2.如果你对类型和接口的合规性监控很重要,你可以为它们编写测试,这些测试将在验证过程中执行,但同时不影响覆盖率报告。**网上有很多关于如何做到这一点的选项,但我最喜欢将测试的接口分配给变量的方式。:

interface IResponse {
  success: boolean;
  message: string;
}

describe('IResponse interface', () => {
  it('should have a boolean property named success', () => {
    const response: IResponse = { success: true, message: 'Test message' };
    expect(response.success).toBeDefined();
    expect(typeof response.success).toBe('boolean');
  });

  it('should have a string property named message', () => {
    const response: IResponse = { success: true, message: 'Test message' };
    expect(response.message).toBeDefined();
    expect(typeof response.message).toBe('string');
  });
});

相关问题