【问题标题】:How to test an independent class in angular unit test?如何在角度单元测试中测试独立类?
【发布时间】:2019-08-10 02:42:34
【问题描述】:

我有一个独立的类需要进行角度测试。我想知道如何依赖注入一个模拟服务。

我尝试使用 TestBed 来依赖注入服务。但它不起作用。

// user-setting.ts, class I want to test
constructor(private config: UserSettingDefault, private userSettingsService: UserSettingsService) { }

// user-setting.spec.ts, I try to use TestBed to inject, but failed
class UserSettingsServiceMock {

}

fdescribe('UserSetting', () => {
  let userSettingsService: UserSettingsServiceMock

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        { provide: UserSettingsService, useClass: UserSettingsServiceMock },
      ],
    });

    userSettingsService = TestBed.get(UserSettingsService);
  });

  it('should create an instance', () => {
    const config = { app: 'user', type: 'search', id: 'embeded-link' };
    const userSetting = new UserSetting(config, userSettingsService);
    expect(userSetting).toBeTruthy();
  });
});

我希望我可以为 UserSetting 创建一个新实例。但是抛出一些错误:

ERROR in src/app/core/user/user-settings/user-setting.spec.ts(25,49): error TS2345: Argument of type 'UserSettingsServiceMock' is not assignable to parameter of type 'UserSettingsService'.
  Property 'language' is missing in type 'UserSettingsServiceMock'.

【问题讨论】:

  • 也许您应该创建一个堆栈闪电战,我们应该能够帮助解决问题
  • userSettingsService 是一项复杂的服务。你知道如何在不注入 userSettingsService 的情况下测试 user-setting.ts 吗?
  • 您能否分享更多有关 user-setting.ts 的信息?你说的独立是什么意思?你没有在 Angular 的依赖注入中使用它?
  • 好吧...尝试将language: string 或任何类型的语言添加到您的模拟...您可以使模拟和服务使用相同的界面。

标签: angular unit-testing


【解决方案1】:

因此,如果您在组件中模拟服务,那么您必须提供该服务的虚拟骨架(即,您需要在该组件正在使用的模拟注入依赖项中编写模拟方法和变量)。 您收到错误消息,因为您必须在组件中使用 userSettingsService.language。所以,你也需要模拟这个值。

class UserSettingsServiceMock {
language = {};
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多