mockBackend = getTestBed()。get(MockBackend);?

时间:2016-10-26 01:56:22

标签: unit-testing angular karma-runner angular2-testing

我正在学习用Karma测试Angular 2,并且想知道我不理解的代码中的一些要点。配置git status“模拟模块”后,将运行以下代码:

TestBed

这是做什么的?我在另一篇文章中找到了以下解释:“获取对模拟后端的引用,以便我们可以在使用Http.get获取时使用伪数据进行响应”,但我不明白为什么我需要“获取它”,isn来自导入 mockBackend = getTestBed().get(MockBackend); 已经存在吗?或者模块是否以某种方式获得方法?

我之后会这样使用它......但仍然不明白为什么我必须将它连接到试验台上:

{MockBackend, MockConnection} from '@angular/http/testing';

简而言之,实际问题是 - 我发布的第一行代码是做什么的?

完整代码,仅供上下文使用:

    mockBackend.connections.subscribe(
        (connection: MockConnection) => {
            connection.mockRespond(new Response(
                new ResponseOptions({
                        body: "lol data"
                    }
                )));
        });

代码来自tutorial here

1 个答案:

答案 0 :(得分:2)

  

它已经存在于import {MockBackend, MockConnection} from '@angular/http'

这只允许您访问符号/类。就像您要在组件中使用服务一样,您需要将服务导入组件文件

import { SomeService } from './some.service'

class SomeComponent {
  constructor(service: SomeService) {}
}

如果我们没有导入SomeService,我们会收到错误"无法找到符号SomeService"。但这只是一个编译时检查。这不足以将服务的实例用作运行时。如果这就是我们所有的,那么在运行时,我们会得到错误"没有SomeService"的提供者。我们仍然需要将if添加到providers以便Angular知道创建它,并在运行时将实例传递给组件

import { NgModule } from '@angular/core';
import { SomeService } from './some.service';
import { SomeComponent } from './some.component';

@NgModule({
  declarations: [ SomeComponent ],
  providers: [ SomeService ]
})
class SomeModule {}

同样的事情,我们需要将组件符号/类导入到模块文件中,以便我们可以在该文件中使用符号/类。

MockBackend而言,您将该类添加到提供者

providers: [ MockBackend ]

这告诉Angular创建实例,允许它是可注入的。然后,将由Angular创建的实例注入工厂方法

useFactory: (backend: MockBackend, options: BaseRequestOptions) => {
  return new Http(backend, options);
}

现在Http将在我们发出请求时使用MockBackend的该实例。但我们需要访问同一个实例,以便我们可以模拟响应。为了得到它,我们需要从Angular注入器(它是所有提供者的容器)中获取它。要在测试期间访问进样器,我们可以通过TestBed,它就像测试环境的进样器一样

mockBackend = TestBed.get(MockBackend);

在这里,我们要求Angular在其注入器中查找提供者MockBackend。这将是注入useFactory函数的相同实例。因此,我们确保在MockBackend正在使用的Http实例上模拟响应。

相关问题