angular - 为什么我们应该在 Angular 单元测试中使用 Jasmine Spy 对象?

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

我对使用 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)所有依赖项和“其他依赖项的依赖项”?

enter image description here

最佳答案

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

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

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

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

  2. 您甚至可以覆盖实际实现(写在 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/

相关文章:

c# - 在单元测试中获取命令行参数

java - 在 Java 中捕获虚假单元测试

css - 是否可以将 .css 和 .scss 文件都用于 angular 2 组件?

javascript - Angular 2使用onchange创建html元素

arrays - 迭代一种类型的数组并仅复制另一种类型的另一个数组中的特定项

AngularJs + typescript : error TS2307: Cannot find module 'angular'

javascript - 传递给组件的 ReactJS/Jest : How to test/mock a function,

javascript - 为什么我的 ngModal 值在我的 html select 中获取的是字符串值而不是 bool 值 true 或 false?

angular - 在 Angular 中的兄弟组件之间传递数据

typescript - 如何使用 CDK 正确配置 CORS 的 APIGateway