我正在尝试学习如何使用Karma和Jasmine对Angular进行单元测试。
[我的问题是,我使用spyOn()和Expect.toHaveBeenCalled()做到了这一点,即使Karma说通过了测试,代码覆盖率也没有更新。
我是角单元测试的新手,我不知道如何正确地测试方法以获取代码覆盖率。
感谢大家的帮助。
这是我要测试的服务:
import { Injectable } from '@angular/core';
import { environment } from '../../environments/environment';
@Injectable({
providedIn: 'root',
})
export class EnvironmentService {
constructor() { }
public static isOAuthEnabled(): boolean {
return environment.oAuthEnable;
}
public static isProduction(): boolean {
return environment.production;
}
}
我的规格:
import { TestBed, inject } from '@angular/core/testing';
import { EnvironmentService } from './environment.service';
describe('EnvironmentService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [EnvironmentService],
});
});
it('should be created', inject([EnvironmentService], (service:
EnvironmentService) => {
expect(service).toBeTruthy();
}));
it('isProduction', inject([EnvironmentService], (service:
EnvironmentService) => {
let env = new EnvironmentService();
spyOn(EnvironmentService, 'isProduction');
EnvironmentService.isProduction();
expect(EnvironmentService.isProduction).toHaveBeenCalledWith();
}));
});
我不知道为什么它将一种方法标记为已测试,而另一种方法却未标记。
spyOn(EnvironmentService, 'isProduction');
会覆盖服务方法,然后EnvironmentService.isProduction();
正在调用间谍而不是您的方法。因此,不会调用您的方法。有效的测试将删除间谍,并且看起来像expect(EnvironmentService.isProduction()).toBe(false)