嘲笑分支代码覆盖范围 - 无效值的问题

发布于 2025-01-19 21:49:45 字数 1861 浏览 2 评论 0原文

乍一看,问题看起来非常简单,但不幸的是,当可空 getter 为空时,我在覆盖测试场景时遇到问题。考虑下面的示例:

@Component({
selector: 'sample-form-test',
templateUrl: './sample-form-test.component.html'
})
export class SampleFormTestComponent implements ngOnInit {

form?: FormGroup;

get name(): FormControl | null {
   return this.form?.get('name') as FormControl;
}

constructor(private formBuilder: FormBuilderService) {}

ngOnInit() {
   this.form = this.formBuilder.build();
}

在代码覆盖率报告中始终强调上面 getter 内的问号未被测试覆盖。即使我尝试在组件创建后直接检查 getter 是否为 null 来覆盖它:

describe('create SampleFormTestComponent', () => {

   let spectator = Spectator<SampleFormTestComponent>; // from @ngneat/Spectator
   const createComponent = createComponentFactory({ // from @ngneat
      component: SampleFormTestComponent,
      providers: MockProvider(FormBuilderService, {
         build: () => {
            new FormGroup({name: new FormControl})
         }
      }
   });  
 
   it('should create', () => {
      spectator = createComponent();
      expect(spectator).toBeTruthy();

      expect(spectator.component.name).toBeNull(); 
   });
}

它根本没有帮助,并且分支覆盖率总是会被可为 null 的 getter 降低。最糟糕的情况是当我在类中有多个它们时 - 在这种情况下不可能满足代码覆盖率要求。你知道我怎样才能轻松解决这个问题吗?

更新

最简单的方法是在构造函数中初始化表单 - 它将允许访问表单属性(即使这些属性为空),而无需检查这些值是否为空。

@Component({
selector: 'sample-form-test',
templateUrl: './sample-form-test.component.html'
})
export class SampleFormTestComponent implements ngOnInit {

form: FormGroup;

get name(): FormControl {
   return this.form.get('name') as FormControl;
}

constructor(private formBuilder: FormBuilderService) {
   this.form = this.formBuilder.build();
}

这是更新后的 Stackblitz 解决方案

At first glance problem looks really easy, but unfortunately I have a problem with covering test scenario when nullable getter is null. Considering the sample below:

@Component({
selector: 'sample-form-test',
templateUrl: './sample-form-test.component.html'
})
export class SampleFormTestComponent implements ngOnInit {

form?: FormGroup;

get name(): FormControl | null {
   return this.form?.get('name') as FormControl;
}

constructor(private formBuilder: FormBuilderService) {}

ngOnInit() {
   this.form = this.formBuilder.build();
}

It is always underlined in a code coverage report that the question mark inside the getter above is not covered by the tests. Even if I try to cover it by checking directly whether is that getter null right after a component creation:

describe('create SampleFormTestComponent', () => {

   let spectator = Spectator<SampleFormTestComponent>; // from @ngneat/Spectator
   const createComponent = createComponentFactory({ // from @ngneat
      component: SampleFormTestComponent,
      providers: MockProvider(FormBuilderService, {
         build: () => {
            new FormGroup({name: new FormControl})
         }
      }
   });  
 
   it('should create', () => {
      spectator = createComponent();
      expect(spectator).toBeTruthy();

      expect(spectator.component.name).toBeNull(); 
   });
}

It doesn't help at all and branch coverage is always lowered by that nullable getters. The worst scenario is when I have them multiple inside the class - in that scenario it is not possible to meet code coverage requirements. Do you know how can I easily solve that problem?

UPDATE

The easiest way is to initialize form in a constructor – it will allow to access the form properties (even if those are empty) without necessity to check if those values are null ot not.

@Component({
selector: 'sample-form-test',
templateUrl: './sample-form-test.component.html'
})
export class SampleFormTestComponent implements ngOnInit {

form: FormGroup;

get name(): FormControl {
   return this.form.get('name') as FormControl;
}

constructor(private formBuilder: FormBuilderService) {
   this.form = this.formBuilder.build();
}

Here is the updated Stackblitz solution

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文