Angular 2 rc5,服务单元测试问题

3
@Injectable()
export class Service1 {
    constructor( private s2 : Service2 ) { 
        console.log( s2.name );
     }
}

@Injectable()
export class Service2 {
    public name: string = 'Hi';
}


//------------Test-------------

let service1: MockService1;  // MockService1 extends Service1
let service2: MockService2;  // MockService2 extends Service2

beforeEach(() => {
    TestBed.configureTestingModule({
        providers: [
            { provide: Service1, useClass: MockService1 },
            { provide: Service2, useClass: MockService2 }
        ]
    })
});  

beforeEach(inject( [ Service1 , Service2 ], ( s1: MokcService1 , s2: MockService2  ) => { 
    service1 = s1;
    service2 = s2; 
}));

it('should be defined ', () => {
    expect( service1 ).toBeDefined(); 
    expect( service2 ).toBeDefined();
});

我遇到了一个问题:

TypeError: undefined is not an object (evaluating 's2.name')

这是因为Service2没有被定义。

之前使用addProviders和provide时,同样的代码是可以工作的。

beforeEach(() => {
    addProviders([
        provide(Service1, {useClass: MockService1 } ),
        provide(Service2, {useClass: MockService2 } ),
    ]);
});         

这两个测试在去掉console.log( s2.name )后通过了。有什么想法吗?
1个回答

0

在构造函数中注入服务时,请使用 @Inject。

示例:

constructor( @Inject(Service2) private s2 : Service2 ) { 
    console.log( s2.name );
}

你的代码应该使用@Inject(...)而不是$Inject(...),如果你需要@Inject(xxx),其中xxx与参数类型相同,则可能存在其他问题。 - Günter Zöchbauer
啊,没错,@Inject,那是个打错字了。 - Mark Timothy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接