2017-01-31 3 views
1

У меня есть следующие службы я хочу тест:Angular2 TestBed не может найти вложенную поставщика без @Inject

import { Injectable } from "@angular/core"; 

import DepA from "./dep-a" 

@Injectable() 
export default class TestService { 
    private readonly DepA: DepA; 

    public constructor(depA: DepA) { 
     this.DepA = depA; 
    } 
} 

Это зависит от другой службы называется DEPA:

import { Injectable } from "@angular/core"; 

@Injectable() 
export default class DepA { 
} 

теперь я хочу создать модульный тест для TestService со следующим:

import { async, inject, TestBed } from '@angular/core/testing'; 

import DepA from "./dep-a"; 
import TestService from "./test-service"; 

class MockDepA { 
} 

describe("TestService",() => { 
    beforeEach(() => { 
     let dep = new DepA(); 

     TestBed.configureTestingModule({ 
      providers: [ 
       TestService, 
       { provide: DepA, useValue: dep }, 
      ] 
     }); 
    }); 

    it('should construct', inject(
     [TestService], (testService: TestService) => { 
      expect(testService).toBeDefined(); 
     })); 
}); 

Это дает мне следующее сообщение об ошибке:

$ ./node_modules/karma/bin/karma start karma.conf.js 
Chrome 55.0.2883 (Windows 10 0.0.0) TestService should construct FAILED 
     Error: Can't resolve all parameters for TestService: (?). 
Chrome 55.0.2883 (Windows 10 0.0.0): Executed 1 of 1 (1 FAILED) (0.033 secs/0.021 secs) 

Когда я изменяю конструктор TestService от public constructor(depA: DepA) { к public constructor(@Inject(DepA) depA: DepA) {, кажется, работает хорошо. Есть ли какая-то причина, по которой я должен аннотировать мои инъекции с помощью @Inject() в своих модульных тестах, но это нормально работает при нормальных обстоятельствах?

+0

Я проверил ваш код, и он отлично подходит для меня с последней версией ng-cli. –

+0

Я также проверил свой код на семестре быстрого запуска (https://github.com/angular/quickstart), и, похоже, он действительно работает отлично. Поэтому я думаю, что проблема связана с проблемой файла конфигурации. Проблема, скорее всего, связана с тем, что я использую webpack; Мне очень нужно настраивать различные среды производства и выпуска. Я отвечу здесь, если я это выясню. Мой karma.conf.js можно найти по адресу http://pastebin.com/prcnsjVR, а также по адресу webpack.conf.js по адресу http://pastebin.com/T28GJMGN. – Shammah

ответ

0

Возможно, это не тот ответ, который люди ищут; но я переписал свою среду отладки таким образом, что на выходе теперь появилось множество файлов .spec.js, вместо использования предварительного процессора Karma. Я не уверен, почему это не сработало; только это так делает работа для меня.