ReferenceError:初始化之前无法访问服务

时间:2020-01-09 14:14:49

标签: angular karma-jasmine

当我在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

有帮助吗?

3 个答案:

答案 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) {
}

解决了这个问题。天啊。