【问题标题】:ReferenceError: Cannot access Service' before initializationReferenceError:在初始化之前无法访问服务'
【发布时间】:2023-03-16 23:44:01
【问题描述】:

当我在 angular8 应用程序上使用 jasmine 运行单元测试时出现错误。 我有一个服务,在这个服务里面我注入了另一个服务

@Injectable({
  providedIn: 'root'
})

export class FirstService {
  constructor(private http: HttpClient, private configService: ConfigurationService) { }

当我执行 npm run test 时,我总是遇到错误:

在 afterAll ReferenceError 中抛出错误:无法访问 初始化前的“ConfigurationService” 在 Module.ConfigurationService (http://localhost:9876/_karma_webpack_/main.js:1095:112)

有什么帮助吗?

【问题讨论】:

  • 您在 FirstService 中使用 ConfigurationService。因此,您必须为 ConfigurationService 创建一个模拟
  • 请分享您的.spec.ts文件内容
  • 我的 .spec.ts 文件中有这个:code describe('FirstService', () => { let configService; beforeEach(() => { configService = jasmine.createSpyObj('configService', ['getConfiguration']); TestBed.configureTestingModule({ imports: [HttpClientTestingModule], providers: [{ provide: ConfigurationService, useValue: configService }, FirstService] }) configService.getConfiguration.and.returnValue({ serviceRestUrl: URL }); }); it('should be created', inject([FirstService], (service: FirstService) => { expect(service).toBeTruthy(); })); code
  • @faoc 你找到解决这个问题的办法了吗?

标签: angular karma-jasmine


【解决方案1】:

您需要提供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的这一部分

【讨论】:

  • 感谢您的建议。我认为 FirstService 存在一些问题。因为如果我在 firstservice.spec 中注释所有块代码,我得到完全相同的错误。 ReferenceError:在 Module.ConfigurationService (localhost:9876/_karma_webpack_/main.js:1095:112) (_karma_webpack_/src/app/shared/services/tags/first.service.ts:13:64) 初始化之前无法访问“ConfigurationService”
  • @faoc 你是在用APP_INITIALIZER 加载FirstService 吗?在任何情况下,包含ConfigurationService 的模块在您尝试将其传递给FirstService 时尚未加载。确保包含您的ConfigurationService 的模块列在急切加载的模块的导入数组中。
  • 我有两个服务,providedIn:'root';在“ng build”上它运行完美,没有任何问题,这个问题只发生在“ng test”
【解决方案2】:

这可能是一个非常具有误导性的错误消息。

可能是循环依赖导致的,解决你的循环依赖!

运行“npm run test”时不会看到循环依赖警告,但运行“npm run serve”或“npm run build”时会收到警告。

【讨论】:

  • 帮我解决了问题
【解决方案3】:

就我而言,这是一个非常愚蠢的错误。我正在使用抽象服务和 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) {
}

解决了这个问题。天哪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 2021-09-10
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多