Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing mockBackend=getTestBed().get(mockBackend);?_Unit Testing_Angular_Karma Runner_Angular2 Testing - Fatal编程技术网

Unit testing mockBackend=getTestBed().get(mockBackend);?

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

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

    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
实例上模拟响应