【问题标题】:Which scenarios we want to use constructor injection and spyon() injection? and which one is best?哪些场景我们要使用构造函数注入和 spyon() 注入?哪一个是最好的?
【发布时间】:2018-07-16 02:59:57
【问题描述】:

我的 Componenet MaintainCOCComponent 构造函数有一个 MaintainCOCService 的参数,它具有 API 调用方法服务。

export class MaintainCOCComponent {

constructor(
   private maintaincocservice: MaintainCOCService) { }
}

构造函数注入:

在这里我已经配置了 testBed 并通过提供者注入了一个模拟 MockMaintainCOCService 服务

TestBed.configureTestingModule({
  imports: [FormsModule, RouterTestingModule.withRoutes([])],
  declarations: [MaintainCOCComponent],
  providers: [
    { provide: MaintainCOCService, useClass: MockMaintainCOCService }]
});

SpyOn 注入

在这里,我使用 SpyOn 模拟了真正的服务。

providers: [
            { provide: MaintainCOCService, useClass:MaintainCOCService }]

_maintainCOCService = fixture.componentRef.injector.get(MaintainCOCService);
spyOn(_maintainCOCService , 'Method1')
            .and.callFake(function (key, value) {
                return 1;
            });
 spyOn(_maintainCOCService , 'Method2')
            .and.callFake(function (key, value) {
                return 2;
            });

我们可以直接在provider中传递mock服务,而不是使用spyon来模拟每一个方法。那么我们要在哪个场景使用构造函数注入,在哪个场景使用Spyon注入呢?哪一个最好?

【问题讨论】:

    标签: javascript angular unit-testing typescript jasmine


    【解决方案1】:

    通常,当您需要模拟整个服务时,您将使用 Constructor Injection 模拟,例如,您有一个在其内部使用 FB SDK 的服务,您不希望您的测试会进行“ out" 到 FB,所以通常最好的做法是构建一个实现相同接口的模拟服务并在整个应用程序中模拟它。

    spyOn 方法通常在您需要检查某些获得正确参数的服务时很有用。该服务在函数调用之后所做的通常不是那么有趣。

    小提示,有时spyOn 的使用可能表明您正在测试实现而不是规范。

    【讨论】:

    • 服务只有两种方法时,哪一种最好用?
    • 如果你想模拟“所有方法”(在你的情况下是 2 方法),我会使用构造函数注入器方法。
    • 好!但是使用构造函数注入和使用 spyon 模拟两种方法有什么区别吗?在我的猜测中,代码的长度是不同的?
    • 不,第一个仅在您使用的框架(Angular)中启用,第二个更通用且与框架无关。
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    相关资源
    最近更新 更多