当我在angular8应用程序上使用茉莉花进行单元测试时,出现错误。 我有一项服务,并且在这项服务中注入了另一项服务
@Injectable({
providedIn: 'root'
})
export class FirstService {
constructor(private http: HttpClient, private configService: ConfigurationService) { }
当我执行npm运行测试时,总是出现错误:
所有参考错误后引发错误:无法访问 初始化之前的“ ConfigurationService” 在Module.ConfigurationService(http://localhost:9876/_karma_webpack_/main.js:1095:112)
有帮助吗?
答案 0 :(得分:2)
您需要提供ConfigService
的模拟,因为它是FirstService
的依赖项。最简单的方法是使用间谍。
类似的东西:
let firstService: FirstServicec;
let configServiceSpy: jasmine.SpyObj<ConfigService>;
beforeEach(() => {
const spy = jasmine.createSpyObj('ConfigService', ['getValue']);
TestBed.configureTestingModule({
providers: [
FirstService,
{ provide: ConfigService, useValue: spy }
]
});
// Inject both the service-to-test and its (spy) dependency
configService = TestBed.get(ConfigService);
configServiceSpy = TestBed.get(ValueService);
});
然后,您可以像这样在测试中使用间谍:
it('#getValue should return stubbed value from a spy', () => {
const stubValue = 'stub value';
configServiceSpy.getValue.and.returnValue(stubValue);
expect(firstService.getValue())
.toBe(stubValue, 'service returned stub value');
expect(configServiceSpy.getValue.calls.count())
.toBe(1, 'spy method was called once');
expect(configServiceSpy.getValue.calls.mostRecent().returnValue)
.toBe(stubValue);
});
有关更多信息,请查看Angular Docs
的本部分答案 1 :(得分:0)
这可能是一个非常令人误解的错误消息。
可能是循环依赖引起的,请解决循环依赖!
在运行“ npm run test”时不会看到循环依赖项警告,但是在运行“ npm run serve”或“ npm run build”时会收到警告。
答案 2 :(得分:0)
就我而言,这是一个非常愚蠢的错误。我正在使用抽象服务和 useClass 的东西,并且在一个文件中有这样的东西:
constructor(@Optional() private readonly baseService: BaseService) {
}
export abstract class BaseService {
public abstract doSomething(): void;
}
更改顺序
export abstract class BaseService {
public abstract doSomething(): void;
}
constructor(@Optional() private readonly baseService: BaseService) {
}
解决了这个问题。天啊。