【问题标题】:Jasmine test for local property本地财产的茉莉花测试
【发布时间】:2020-12-15 07:42:03
【问题描述】:

我无法应用在此问题中被接受为答案的 objectContaining: Jasmine test for object properties 因为我没有全局对象。

我的设置是: 当用户单击一个按钮时,onApplyFilter() 被调用并将一个名为 filterReady 的本地对象放在一起。属性值是从全局类中获取的。然后它将这个属性传递给另一个函数。

onApplyFilter() {
    const filterReady = new Filter();
    filterReady.maxCount = this.maxCount;
    filterReady.language = this.language;
    filterReady.ids = this.ids;
    this.sendFilterReady(filterReady);
  }

我知道如何测试 sendFilterReady 是否被模拟调用,但是编写另一个测试将 filterReady 放在一起是否有意义?对此的测试应该是什么样子?

【问题讨论】:

  • 如果您已经测试了 sendFilterReady 是否已被调用(提示:.toHaveBeenCalledWith(expectedParams)),那么您将隐式检查 filterReady 是否已正确映射。
  • 做覆盖,它所有的分支都已经被覆盖了——那么这样做几乎没有意义。

标签: angular object jasmine


【解决方案1】:

因为this.sendFilterReady 是您班级的一部分,所以最好的等待不是监视它,而是监视它调用的服务(例如 httpClient)。

例如

sendFilterReady(filter) {
  this.http.get('blabla', filter);
}

那么你可以这样断言

const spy = spyOne(httpClient, 'get');
obj.onApplyFilter();

const expected = new Filter();
expected.maxCount = 123;
expected.language = 'en';
expected.ids = [1, 2, 3];
expect(spy).toHaveBeenCalledWith(expected);

【讨论】:

  • 感谢您的意见。由于我确实测试了所有属性是否设置正确,因此我决定不检查 filterReady 是否设置正确,因为听起来很确定,良好的覆盖率会使该测试变得多余
  • 是的,正确的方法是测试副作用,因为 sendFilterReady 可以取消设置/更改属性并且测试不再有意义。所以正确的方法是测试输入是否会导致输出,但中间输入发生了什么并不重要。
猜你喜欢
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多