【问题标题】:Why should we use Jasmine Spy Object in Angular Unit Testing?为什么我们应该在 Angular 单元测试中使用 Jasmine Spy 对象?
【发布时间】:2020-08-25 11:50:58
【问题描述】:

我有一个关于使用 Jasmin/Karma 进行 Angular 单元测试的问题。

我有以下 3 种服务:EmployeeService、SalaryService 和 TaxationService。

EmployeeService 依赖于 SalaryService,它被注入到它的构造函数中。

SalaryService 依赖于 Taxation 服务,该服务再次注入到它的构造函数中。

在我的employee.component.spec.ts 中,我有以下代码:

let employeeService: EmployeeService;
let salaryServiceSpy: jasmine.SpyObj<SalaryService>;

TestBed.configureTestingModule({
 providers: [EmployeeService],
 declarations: [ EmployeeComponent ]
})
.compileComponents();
  employeeService = TestBed.inject(EmployeeService);
  salaryServiceSpy = TestBed.inject(SalaryService) as jasmine.SpyObj<SalaryService>;
}));

it('should return Name and Salary', () => {
  expect(employeeService.getEmployeeNameAndSalary(1)).toBe("John Smith receives: $12345 and tax value of 15%");
});

代码工作正常,我的问题是为什么我们需要使用 Jasmine Spy - 代码在没有间谍服务的情况下也能正常工作?

 salaryServiceSpy = TestBed.inject(SalaryService) as jasmine.SpyObj<SalaryService>;

我已使用以下内容作为参考:https://angular.io/guide/testing-services

如果下面的例子更清楚,那么需要创建 ValueServiceSpy 吗? TestBed.inject 是否尚未注入所有依赖项和“其他依赖项的依赖项”?

【问题讨论】:

  • 正如稍后在角度指南中解释的那样,间谍用于测试。由于您不使用它,因此您不需要自己定义它。间谍角色是“间谍”服务。如果您在 MasterService 中的某个位置调用了 ValueService 中的函数,则可以使用此 spy 来检查该函数是否被调用。

标签: angular typescript unit-testing dependency-injection karma-jasmine


【解决方案1】:

让我解释一下,几年前我也有类似的问题:

我们为什么要在 Angular 单元测试中使用 Jasmine Spy 对象?

答案:因为当您创建 spy 时,您可以在单元测试中执行以下任务:

  1. 你可以检查函数是否被调用(通过使用`expect(component.method).toHaveBeenCalled())

  2. 您甚至可以覆盖实际的实现(写在service.ts 中)并返回一些虚拟数据来为单元测试用例创建多个场景。

你检查了这个article,我在其中使用了 Stub,这与你在 Angular 指南中看到的不同。我使用了Stubs,因为我可以通过使用useClass 简单地注入providers 来重用使用相同服务的其他other-component.spec.ts。花点时间看看我是如何使用.toHaveBeenCalled() [理解我的point 1],以及我如何使用.returnValue() 重新创建error 服务行为。


创建 ValueServiceSpy 需要什么? TestBed.inject 是否尚未注入所有依赖项和“其他依赖项的依赖项”?

答案:是的,TestBed.inject 确实注入了依赖项,但它注入了实际的 ValueService。对于单元测试,您要隔离“您要测试的服务”(在这种情况下,您要测试MasterService 而不是ValueService)。

因此,在测试MasterServicemock ValueService 是有意义的。


这有意义吗?

【讨论】:

    猜你喜欢
    • 2014-09-13
    • 2013-08-07
    • 2014-05-21
    • 2023-03-24
    • 2018-04-23
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多