使用部分形状进行打字稿单元测试

Vin*_*t J 5 unit-testing typescript

假设我想对打字稿中的函数进行单元测试。此函数使用具有复杂形状的“选项”类型(对象)参数。

interface option {
  param1 : string
  param2 : number
  param3 : { 
    param4 : string
    param5 : boolean
    }
  .
  .
  .
  param15 : string
}

const functionToTest = (opt:option)=>{
   ...do stuff with option
}
Run Code Online (Sandbox Code Playgroud)

现在假设我想编写一个单元测试,在 param1 更改时模拟 functionToTest 的正确行为,忽略对结果没有影响的其他参数。

我的理解是为了让我的测试更有弹性,我可以用普通的 JS 编写

const option1 = {
  param1 : "foo"
}
Run Code Online (Sandbox Code Playgroud)

并做我的测试

expect(functionToTest(option1)).to.be.true;
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用 typescript 编写测试,我将不得不使用所有接口(虚拟)成员编写一个完整的 option1 对象,尽管大多数将被忽略,并且会使读者偏离测试的真正目标。

是否有解决方法或我应该改变我的想法?

Rui*_*ues 6

为此,您可以利用 typescript 的Partial

interface YourInterface {
  prop: string;
  foo: number;
}

const data: Partial<YourInterface> = {   
   prop: 'value'
};

// service is an instance of SomeService
service.sendData(<YourInterface> data);

Run Code Online (Sandbox Code Playgroud)
class SomeService {
  sendData(data: YourInterface) {

  }
}

Run Code Online (Sandbox Code Playgroud)

  • 我不知道这是如何工作的,因为您正在使用 Partial 创建一个新接口,其中问题在于使用现有的类,但属性较少。TS 编译器只会抱怨你缺少属性。 (4认同)
  • 但是然后你使用`&lt;YourInterface&gt; data`来[类型断言](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions)它回到`YourInterface`,所以你也可以从 `const data = { ... } as YourInterface` 开始。 (4认同)