【问题标题】:The else condition is not getting covered via test coverageelse 条件没有被测试覆盖覆盖
【发布时间】:2020-03-09 22:33:30
【问题描述】:

当数据为空时,我正在测试 else 条件。我指的是if(数据)的else。我检查了没有数据的时候,console.log('xxx', data);的值长度为 0。我使用空库以及 {} 作为 return observable 来模拟返回空 observable 的服务。 测试没有通过,因为预期对象({ })未定义。

以下是我迄今为止一直在尝试的事情。不知道哪里出错了

 //component.agreementsService.getOutstandingAgreements(0).subscribe(result => expect(result.length).toBe(0));
    //component.agreementsService.getOutstandingAgreements(0).subscribe(result => expect(result.length).not.toBeGreaterThan(0));
    component.agreementsService.getOutstandingAgreements(1).subscribe(result => expect(result).toBe(undefined));
   // expect(component.agreementsService.getOutstandingAgreements(0)).toBe(undefined);
    //expect(component.dataLength).toBe(undefined);

谁能告诉我问题出在哪里

组件

 import { Observable, of, empty } from 'rxjs';

      public getOutstandingAgreements(Id: number) {
        console.log(Id);

        this.agreementsService.getOutstandingAgreements(Id).subscribe((data: AgreementsModel[]) => {
         console.log('xxx', data);
          if (data.length > 0) {
            this.myData = data;
            this.agreementData = this.myData[0].data;
            this.agreementLength = this.myData.length;
            this.calculateRemainingDaysLeft(0);
          }
        });
      }

测试

 let mockAgreementsService: Mock<AgreementsService>;
         const agreementModel : AgreementsModel[] = [{ userAgreementId: 1,
            agreementId: 1,
            code: '',
            userAgreementStateId: 1,
            userAgreementStateName: '',
            acceptanceWindowExpiry: new Date((new Date()).getTime() + 24*60*60*1000) ,
            version: '',
            data: '<h1></h1>',
            authoredById: 1,
            authoredByName: '',
            authored: new Date((new Date()).getTime() + 24*60*60*1000)  ,
            issuedById: 1,
            issuedByName: '',
            issued: new Date((new Date()).getTime() + 24*60*60*1000) }];


          configureTestSuite(() => {
            TestBed.configureTestingModule({
              imports: [SharedModule, FontAwesomeModule],
              declarations: [AgreementComponent, CustomScrollDirective],
              providers: [{ provide: UserService, useValue: mockUserService },
              { provide: AgreementsService, useFactory: () => mockAgreementsService.Object   }]
            });
          });

          function setupComponent() {
            fixture = TestBed.createComponent(AgreementComponent);
            component = fixture.componentInstance;

          }


          beforeEach(() => {
            mockAgreementsService = new Mock<AgreementsService>({
              getOutstandingAgreements: () => of(agreementModel),
              updateAgreement: () => Promise.resolve([])
            });
            });




           fit('should not return data when  getOutstandingAgreements is called', () => {
setupComponent();
mockAgreementsService.extend({ getOutstandingAgreements: () => of(<AgreementsModel[]>{})});
//component.agreementsService.getOutstandingAgreements(0).subscribe(result => expect(result.length).toBe(0));
//component.agreementsService.getOutstandingAgreements(0).subscribe(result => expect(result.length).not.toBeGreaterThan(0));
component.agreementsService.getOutstandingAgreements(1).subscribe(result => expect(result).toBe(undefined));
// expect(component.agreementsService.getOutstandingAgreements(0)).toBe(undefined);
//expect(component.dataLength).toBe(undefined);

});

更新 1

以下通过了测试,但是测试覆盖率失败,说 else 条件不满足。

mockAgreementsService.extend({ getOutstandingAgreements: () => of<AgreementsModel[]>([]) });
component.agreementsService.getOutstandingAgreements(0).subscribe(result => expect(result.length).not.toBeGreaterThan(0));

【问题讨论】:

  • 你的模拟应该返回未定义。 if 检查返回 true 并返回一个空数组 []
  • 我已经尝试了以下但测试仍然没有涵盖。 it('在调用 getOutstandingAgreements 时不应返回数据', () => { setupComponent(); mockAgreementsService.extend({ getOutstandingAgreements: () => undefined}); //component.agreementsService.getOutstandingAgreements(0).subscribe(结果 => 期望(结果).toBe(未定义));期望(component.agreementsService.getOutstandingAgreements(0)).toBe(未定义);});
  • 我刚刚更新了帖子。请参阅更新部分。测试通过但测试覆盖失败
  • 你能分享一个小提琴或codepen吗?

标签: angular jasmine


【解决方案1】:

您正在订阅 observable,因此它不会进入测试中 getOutstandingArguments 函数内的订阅内。

要测试订阅内部的逻辑,您需要确保您的操作会在测试中触发订阅,因此在您的情况下,您希望直接调用该方法。你会希望你的测试是这样的:

it('should not set data when getArguments is called', () => {
    /* setup return value to be empty array */
    mockAgreementsService.extend({ getOutstandingAgreements: () => of(<AgreementsModel[]>{})});

    // after setting up the return value now call component.getOutstandingAgreements
    component.getOutstandingAgreemnts(0);

    // now check that data has not been modified
    // note I do not know what the initial value of myData is I am assuming it is an empty array
    expect(component.myData.length).toBe(0);
    /* if myData is not initialized and not set to an empty array by default do the following */
    expect(component.myData).toBe(undefined);
}

现在它应该进入在组件中的方法内部创建的 observable 的订阅中,与您在测试中所做的订阅相对应

【讨论】:

  • 我收到错误错误::getOutstandingAgreements 已被监视。如您所见,我正在使用 mockAgreementsService.extend({ getOutstandingAgreements: () => of([]) });这有什么问题
  • 你可以这样做并没有错。用你的扩展替换我的间谍应该以同样的方式工作。我不熟悉扩展这就是为什么我以我的方式输入答案
  • 我现在收到错误无法读取未定义的属性“长度”
  • 将期望更改为 (component.myData).toBe(undefined);我不确定你的 myData 是如何定义的,我认为它是一个空数组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多