Unit testing mockBackend=getTestBed().get(mockBackend);?
我正在学习使用Karma测试Angular 2,并想知道代码中一些我不理解的地方。在配置了Unit testing mockBackend=getTestBed().get(mockBackend);?,unit-testing,angular,karma-runner,angular2-testing,Unit Testing,Angular,Karma Runner,Angular2 Testing,我正在学习使用Karma测试Angular 2,并想知道代码中一些我不理解的地方。在配置了测试台“模拟模块”后,将运行以下代码: mockBackend = getTestBed().get(MockBackend); 这有什么用?我在另一篇文章中找到了以下解释:“获取对mock后端的引用,这样我们就可以在使用Http.get获取时使用假数据进行响应”,但我不明白为什么我需要“获取它”,它不是已经从“@angular/Http/testing”的import{MockBackend,M
测试台
“模拟模块”后,将运行以下代码:
mockBackend = getTestBed().get(MockBackend);
这有什么用?我在另一篇文章中找到了以下解释:“获取对mock后端的引用,这样我们就可以在使用Http.get获取时使用假数据进行响应”,但我不明白为什么我需要“获取它”,它不是已经从“@angular/Http/testing”的import{MockBackend,MockConnection}中出现了吗代码>?还是模块以某种方式获得了方法
我后来就这样使用它……但仍然不明白为什么我必须将它连接到测试台上:
mockBackend.connections.subscribe(
(connection: MockConnection) => {
connection.mockRespond(new Response(
new ResponseOptions({
body: "lol data"
}
)));
});
简而言之,实际的问题是——我发布的第一行代码是做什么的
完整的代码,仅用于上下文:
import { TestBed, getTestBed, async, inject } from '@angular/core/testing';
import { Headers, BaseRequestOptions, Response, HttpModule, Http, XHRBackend, RequestMethod} from '@angular/http';
import {ResponseOptions} from '@angular/http';
import {MockBackend, MockConnection} from '@angular/http/testing';
import {FooHttpService} from '../../services/foo-service.service.ts';
describe('My Service Making an Http Call', () => {
let mockBackend: MockBackend;
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
FooHttpService,
MockBackend,
BaseRequestOptions,
{
provide: Http,
deps: [MockBackend, BaseRequestOptions],
useFactory:
(backend: XHRBackend, defaultOptions: BaseRequestOptions) => {
return new Http(backend, defaultOptions);
}
}
],
imports: [
HttpModule
]
});
mockBackend = getTestBed().get(MockBackend);
TestBed.compileComponents();
}));
代码取自一个
从“@angular/http”
import{MockBackend,MockConnection}中导入它不是已经存在了吗
这仅允许您访问符号/类。就像要在组件中使用服务一样,您需要将服务导入组件文件
import { SomeService } from './some.service'
class SomeComponent {
constructor(service: SomeService) {}
}
如果我们没有导入SomeService,我们将得到一个错误“找不到符号SomeService”。但这只是一个编译时检查。这还不足以将服务实例用作运行时。如果这就是我们所拥有的一切,那么在运行时,我们将得到错误“no provider for SomeService”。我们仍然需要将if添加到提供者
,以便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 injector(所有提供者的容器)获得它。要在测试期间访问注入器,我们可以通过测试台
,它的作用类似于测试环境中的注入器
mockBackend = TestBed.get(MockBackend);
在这里,我们要求Angular在其注入器中查找提供者MockBackend
。这将是注入useFactory
函数的同一个实例。因此,我们确保在Http
使用的相同MockBackend
实例上模拟响应