else 条件未通过测试覆盖率覆盖
The else condition is not getting covered via test coverage
我正在测试数据为空时的 else 条件。我指的是 else of if (data)。我检查过没有数据的时候,console.log('xxx',data)的值;长度为 0。我使用空库以及 {} 作为 return 可观察对象来模拟 return 空可观察对象的服务。
测试没有通过,因为 Expected Object({ }) 未定义。
以下是我到目前为止一直在尝试的事情。不确定我哪里错了
//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
以下通过了测试,但测试覆盖率失败,表示不满足其他条件。
mockAgreementsService.extend({ getOutstandingAgreements: () => of<AgreementsModel[]>([]) });
component.agreementsService.getOutstandingAgreements(0).subscribe(result => expect(result.length).not.toBeGreaterThan(0));
您正在订阅可观察对象,因此它不会进入您测试中 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);
}
现在它应该进入组件中方法内部创建的可观察对象的订阅,与您在测试中进行的订阅相对应
我正在测试数据为空时的 else 条件。我指的是 else of if (data)。我检查过没有数据的时候,console.log('xxx',data)的值;长度为 0。我使用空库以及 {} 作为 return 可观察对象来模拟 return 空可观察对象的服务。 测试没有通过,因为 Expected Object({ }) 未定义。
以下是我到目前为止一直在尝试的事情。不确定我哪里错了
//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
以下通过了测试,但测试覆盖率失败,表示不满足其他条件。
mockAgreementsService.extend({ getOutstandingAgreements: () => of<AgreementsModel[]>([]) });
component.agreementsService.getOutstandingAgreements(0).subscribe(result => expect(result.length).not.toBeGreaterThan(0));
您正在订阅可观察对象,因此它不会进入您测试中 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);
}
现在它应该进入组件中方法内部创建的可观察对象的订阅,与您在测试中进行的订阅相对应