gpt4 book ai didi

Angular 7 + Jasmine - 奇怪的 Istanbul 尔覆盖问题(得到 97 而不是 100%)

转载 作者:行者123 更新时间:2023-11-28 20:48:29 26 4
gpt4 key购买 nike

我遇到了 jasmine 的有线问题

当我使用 Istanbul 打印覆盖率时,我得到了 97% 的覆盖率而不是 100%。

if 语句中的一行被标记为红色(意思是没有被覆盖),但可以肯定的是,即使我正在调试它,我也会看到调试器进入这个 if 部分。

这怎么可能?

你可以在下面的代码中看到我的评论,看看哪一行是“未覆盖”

这是我的测试规范

describe('testService', () => {
let testBed: TestBed;
let test: TestService;
let httpClientMock: jasmine.SpyObj<HttpClient>;
let loggerMock: jasmine.SpyObj<Logger>;


beforeEach( async() => {
httpClientMock = jasmine.createSpyObj('httpClient', ['get']);
loggerMock = jasmine.createSpyObj('Logger', [
'debug',
'error',
'trace',
'info',
'build'
]);
loggerMock.build.and.returnValue(loggerMock);
testBed = await TestBed.configureTestingModule({
imports: [],
declarations: [],
providers: [
TestService,
HttpClient,
{ provide: Logger, useValue: loggerMock },
{ provide: HttpClient, useValue: httpClientMock }
]
}).compileComponents();

});

beforeEach(() => {
service = TestBed.get(TestService);
});

it('should create', () => {
expect(service).toBeTruthy();
});

describe('TestService', () => {

const subject$ = new AsyncSubject<any>();

let incomingTestServerData: ReturnType<
typeof getTestServerData
>;
let expectedTestResult: Test;
const defaultsTestValue = new Test();

beforeEach(() => {
incomingTestServerData = getTestServerData();

expectedTestResult = plainToClass(Test, incomingTestServerData);
});

// this test should pass the validation
it('should get test from server', async () => {
httpClientMock.get.and.returnValue(subject$);

service.loadTets();
subject$.next(incomingTestServerData);
subject$.complete();

const testRes: Test = await new Promise((resolve, reject) => {
service.get$.subscribe(value => {
resolve(value);
});
});

expect(defaultsTestValue).toEqual(testRes);
});

it('should resolve default value on validation error', async () => {
// given
httpClientMock.get.and.returnValue(subject$);
incomingTestServerData.value = '10' as any; // create error in validation

// when
service.loadTest();
subject$.next(incomingTestServerData);
subject$.complete();

// then
const TestRes: Test = await new Promise((resolve, reject) => {
service.get$.subscribe(value => {
resolve(value);
});
});

expect(defaultsTestValue).toEqual(TestRes);
});

这是我的服务相关代码:

 get$: Observable<Test>;
private testSubject = new AsyncSubject<Test>()

constructor(private readonly http: HttpClient, logger: Logger) {
this.get$ = this.testSubject.asObservable();
}

async validation(obj: Test) {
const validationResult = await validate(obj);
// this row the coverage is skipped but the debugger not
if (validationResult.length > 0) {
throw new Error('error');

} else {
//do smth without return
}
}

async loadTest() {
if (this.flag) {
return;
}

this.flag = true;

try {
const testRes = await this.http
.get<Test>(TestService.apiEndpoint)
.toPromise();
const obj = plainToClass(Test, testRes as Object);
await this.validation(obj);

} catch (e) {
this.logger.debug(e.message);
this.logger.debug('could not fetch test');
} finally {
this.testSubject.next(this.test);
this.testSubject.complete();
}
}

最佳答案

通过在 beforeEach() 中创建一个新的 asyncSubject 对象来修复

subject = new AsyncSubjecy<any>()

通过这种方式,我确保每次测试都会得到一个新主题,而不会使用以前的主题

关于Angular 7 + Jasmine - 奇怪的 Istanbul 尔覆盖问题(得到 97 而不是 100%),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56461305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com