我正在学习用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。
答案 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
实例上模拟响应。