我对使用 Jasmin/Karma 进行 Angular 单元测试有疑问。
我有以下 3 个服务:EmployeeService、SalaryService 和 TaxationService。
EmployeeService 依赖于注入(inject)到其构造函数中的 SalaryService。
SalaryService 依赖于税收服务,该服务再次注入(inject)到其构造函数中。
在我的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 - 代码在没有 spy 服务的情况下也可以正常工作?
salaryServiceSpy = TestBed.inject(SalaryService) as jasmine.SpyObj<SalaryService>;
我使用以下内容作为引用:https://angular.io/guide/testing-services .
如果下面的示例更清楚,那么需要创建 ValueServiceSpy 吗? TestBed.inject 是否尚未注入(inject)所有依赖项和“其他依赖项的依赖项”?
最佳答案
让我解释一下,几年前我也有过类似的问题:
为什么我们应该在 Angular 单元测试中使用 Jasmine Spy 对象?
答案:因为当你创建spy
时,您可以在单元测试中执行以下任务:
您可以检查函数是否已被调用(通过使用 `expect(component.method).toHaveBeenCalled())
您甚至可以覆盖实际实现(写在
service.ts
内)并返回一些虚拟数据来为单元测试用例创建多个场景。
你检查这个article我使用的 stub 与您在 Angular 指南中看到的不同。我用过Stubs
因为我可以重复使用它其他other-component.spec.ts
它使用相同的服务,只需注入(inject) providers
使用useClass
。慢慢来看看我是怎么用的.toHaveBeenCalled()
[了解我的第1点],以及我如何使用.returnValue()重新创建 error
服务行为。
创建 ValueServiceSpy 需要什么? TestBed.inject 是否尚未注入(inject)所有依赖项和“其他依赖项的依赖项”?
答案:是的,TestBed.inject
确实注入(inject)了依赖项,但它注入(inject)了实际的 ValueService
。对于单元测试,您想要隔离“您想要测试的服务”(在本例中,您想要测试 MasterService
而不是 ValueService
)。
所以, mock
是有道理的。 ValueService
测试时MasterService
.
这有道理吗?
关于angular - 为什么我们应该在 Angular 单元测试中使用 Jasmine Spy 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63578246/