2017-03-07 64 views
2

错误我试图写一个测试对角2.我的测试代码的服务看起来像如下:没有提供给MockBackend!在角2

account.spec.ts

import {} from 'jasmine' 
import { inject, TestBed } from '@angular/core/testing'; 
import { MockBackend } from '@angular/http/testing'; 
import { HttpModule, XHRBackend, Response, ResponseOptions} from '@angular/http'; 
import { AccountService } from './account.service'; 
import { environment } from '../../environments/environment'; 


fdescribe('with mocked account service',()=>{ 
    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     imports: [HttpModule], 
     providers: [ 
     { provide:environment.api_url}, 
     AccountService, 
     { provide: XHRBackend, useClass: MockBackend }, 
     ] 
    }); 
    }); 

    fdescribe('user()',()=> { 
    it('should return an Observable', inject([AccountService, MockBackend], 
     (accountService, mockBackend) => { 
     const mockResponse = { 
      data:[ 
      {user_id:0, organization_id:0, full_name:'John Smith', organization:'hospital', email:'[email protected]'}, 
      ] 
     }; 

     mockBackend.connections.subscribe((connection) => { 
      connection.mockRespond(new Response(new ResponseOptions({ 
      body: JSON.stringify(mockResponse) 
      }))); 
     }); 

     accountService.user().subscribe((users)=> { 
      expect(users.length).toBe(1); 
      expect(users[0].full_name.toEqual('John Smith')) 
     }); 
    })); 
    }); 
}); 

为模型的用户,它低于代码: user.model.ts

export interface User { 
    user_id: number; 
    organization_id: number; 
    full_name: string; 
    organization: string; 
    email: string; 
} 

当我跑纳克测试,我得到这个错误:

Chrome 56.0.2924 (Linux 0.0.0) with mocked account service user() should return an Observable FAILED 
     Error: No provider for MockBackend! 
     Error: DI Error 
      at NoProviderError.ZoneAwareError (webpack:///~/zone.js/dist/zone.js:958:0 <- src/polyfills.ts:4398:33) 
      at NoProviderError.BaseError [as constructor] (webpack:///~/@angular/core/src/facade/errors.js:22:0 <- src/test.ts:33829:16) 
      at NoProviderError.AbstractProviderError [as constructor] (webpack:///~/@angular/core/src/di/reflective_errors.js:54:0 <- src/test.ts:64479:16) 
      at new NoProviderError (webpack:///~/@angular/core/src/di/reflective_errors.js:116:0 <- src/test.ts:64541:16) 
      at ReflectiveInjector_._throwOrNull (webpack:///~/@angular/core/src/di/reflective_injector.js:485:0 <- src/test.ts:102328:19) 
      at ReflectiveInjector_._getByKeyDefault (webpack:///~/@angular/core/src/di/reflective_injector.js:524:0 <- src/test.ts:102367:25) 
      at ReflectiveInjector_._getByKey (webpack:///~/@angular/core/src/di/reflective_injector.js:456:0 <- src/test.ts:102299:25) 
      at ReflectiveInjector_.get (webpack:///~/@angular/core/src/di/reflective_injector.js:325:0 <- src/test.ts:102168:21) 
      at TestBed.get (webpack:///~/@angular/core/bundles/core-testing.umd.js:827:0 <- src/test.ts:9245:67) 
      at webpack:///~/@angular/core/bundles/core-testing.umd.js:832:50 <- src/test.ts:9250:65 
      at Array.map (native) 
      at TestBed.execute (webpack:///~/@angular/core/bundles/core-testing.umd.js:832:0 <- src/test.ts:9250:33) 
      at Object.<anonymous> (webpack:///~/@angular/core/bundles/core-testing.umd.js:922:32 <- src/test.ts:9340:49) 
      at ZoneDelegate.invoke (webpack:///~/zone.js/dist/zone.js:330:0 <- src/polyfills.ts:3770:26) 
      at ProxyZoneSpec.onInvoke (webpack:///~/zone.js/dist/proxy.js:79:0 <- src/test.ts:91173:39) 

我希望能得到帮助解决这个错误。谢谢。

+0

将'MockBackend'添加到提供者部分下的应用程序模块组件 – Smit

回答

2

需要将MockBackend添加到您的测试NgModule的提供程序列表中。

TestBed.configureTestingModule({ 
    imports: [HttpModule], 
    providers: [ 
    { provide:environment.api_url}, 
    AccountService, 
    { provide: XHRBackend, useClass: MockBackend }, 
    MockBackend, // <-- add this line 
    ] 
}); 

说明: 你的测试模块是说,如果一个组件/服务请求XHRBackend,给它MockBackend的一个实例来代替。但是您从未指定如何获取MockBackend的实例。

0

MockBackend需要添加到你的app-module.ts组件。

import { NgModule }  from '@angular/core'; 
import { BrowserModule } from '@angular/platform-browser'; 
import { FormsModule } from '@angular/forms'; 
import { AppComponent } from './app.component'; 
import { RouterModule, Routes } from '@angular/router'; 
import { HttpModule } from '@angular/http'; 

import {AppRoutingModule, routableComponents } from './app-routing.module'; 
import { MockBackend } from '< MockBackend module location>'; 

@NgModule({ 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    AppRoutingModule, 
    HttpModule 
    ], 
    declarations: [ 
    AppComponent, 
    routableComponents 
    ], 
    providers: [ 
    MockBacked 
    ], 
    bootstrap: [ AppComponent] 
}) 
export class AppModule { 
}