2017-01-02 1 views
0

Ниже приведена ошибка, когда я запустил команду ng test.`ng test` показывает ошибку: не удается разрешить все параметры для BackendService

Вот моя спецификация услуг,

describe('BackendService',() => { 
    beforeEach(() => { 
    TestBed.configureTestingModule({ 
     providers: [ 
     { 
      provide: Http, useFactory: (backend, options) => { 
      return new Http(backend, options); 
      }, 
      deps: [MockBackend, BaseRequestOptions] 
     }, 
     MockBackend, 
     BaseRequestOptions, 
     BackendService 
     ] 
    }); 
    }); 

    it('should ...', inject([BackendService, MockBackend], (service: BackendService) => { 
    expect(service).toBeTruthy(); 
    }) 

); });

BackendService.ts выглядит,

export class BackendService { 
    private baseUrl: string = 'https://foo-backend.appspot.com/_ah/api/default/v1'; 

    constructor(private http: Http, baseName: string) { 
    this.baseUrl = this.baseUrl + baseName; 
    } 
    ..... 
} 

Похоже, что дополнительный параметр в конструктор класса BackendService вызывает эту проблему ..

ответ

1

Как вы можете ожидать Угловая знать, что baseName должно быть? Все параметры конструктора должны быть получены от Инжектора. И если для параметра нет соответствующего токена, он не может быть просмотрен.

Вы можете добавить маркер, выполнив

// somewhere in some file 
import { OpaqueToken } from '@angular/core'; 

export const BASE_NAME_TOKEN = new OpaqueToken("app.base_name"); 

// in test class 
import { BASE_NAME_TOKEN } from 'where-ever' 

TestBed.configureTestingModule({ 
    providers: [ 
    BackendService, 
    { provide: BASE_NAME_TOKEN, useValue: 'whatever-the-base-is' } 
    ] 
}); 

// in service constructor 
import { Inject } from '@angular/core' 
import { BASE_NAME_TOKEN } from 'where-ever' 

constructor(http: Http, @Inject(BASE_NAME_TOKEN) baseName: string) {} 

Смотрите также:

+0

Я не хочу ничего менять в своем конструкторе код. На данный момент это работает отлично. Но я не знаю, как написать тестовый файл. Я сконфигурировал тестовый стенд, как и вы. –

+0

Как вы ожидаете, что Angular узнает, откуда получить «baseName»? Нет никакой магии, которая случится. Вам нужно настроить Инжектор, чтобы знать, как его получить. В противном случае не добавляйте его в качестве параметра –

+0

_ «Но я не знаю, как написать тестовый файл» _ В какой части тестового примера вы не знаете, как писать? –

Смежные вопросы