0

ユニットのテストを行っていますが、基本テストは失敗します。
cannot resolve all parameters for MyComponent(?.)角4コンポーネントユニットテストですべてのパラメータ(?)を解決できない

私のコンポーネントのコンストラクタにforwardRef()を追加しようとしましたが、動作します。しかし、私はテストの失敗のためにそれを使用したくないので、それはお勧めしません。

タイプミスがある場合は無視してください。コードスニペットを追加しました。申し訳ありませんが、ここに実際のコードを追加することはできません。

SRC
./services
私-サービスc.ts

​​

./components
私-component.ts

import { MyServiceC } from '../services/my-service-c'; 
    @Component() {...} 
    export class MyComponent { 
     private myServiceQ; 
     constructor(private myServiceC: MyServiceC) { 
      this.myServiceQ = this.myServiceC.getMyServiceQ(); 
     } 
    } 

my-コンポーネント.spec.ts

import { MyServiceC } from '../services/my-service-c'; 
    import { MockMyServiceC } from '../fixtures/mock-my-service-c'; 
    import { MyComponent } from './my-component'; 
    ..other imports... 

    beforeEach(() => { 
     TestBed.configureTestingModule({ 
      providers: [ 
       { provide: MyServiceC, useClass: MockMyServiceC } 
      ], 
      declarations: [ MyComponent ] 
     }); 
     fixture = TestBed.createComponent(MyComponent); 
     component = fixture.componentInstance; 
     fixture.detectChanges(); 
    }); 

    it('should be defined', 
     () => expect(component).toBeDefined(); 
    );  

提案がある場合はお知らせください。私は長い間解決策を見つけようとしてきました。事前に 感謝..

+0

私はあなたのテストを見る前に、どうしてあなたのサービスをそのように扱っているのか聞いてもらえますか?なぜあなたはあなたのコンポーネントに 'serviceQ'を直接注入しないのですか? – lexith

+0

申し訳ありませんが要件です。 serviceQを直接公開するべきではありません。 – mperle

+0

さて、それは 'Injectable()'だと思われますので、あなたもそれを提供する必要がありますか、それともあなたの 'MockMyServiceC'に注入するのですか? – lexith

答えて

1

あなたは、あなたのテストでMockMyServiceCを注入現時点で「は、私が実際のサービスと同じ(MockMyServiceCがMockMyServiceQを注入)2つのモックサービスをしました。」という

あなたのコメントに記載されていますMockMyServiceCのすべての依存関係も解決する必要がありますが、提供していません。

ビットはあなたの問題を解決する必要がありますあなたのテストを変更する:

TestBed.configureTestingModule({ 
    providers: [ 
     MockMyServiceQ, 
     { provide: MyServiceC, useClass: MockMyServiceC } 
    ], 
    declarations: [ MyComponent ] 
}); 

ヒント: これはすぐに維持するのは難しいになることができます。あなたの嘲笑されたサービスは、常に同じ、実際のサービスを注入する必要があります。次に、あなただけの、このようにそれらを提供することができ:

TestBed.configureTestingModule({ 
    providers: [ 
     { provide: MyServiceQ, useClass: MockMyServiceQ }, 
     { provide: MyServiceC, useClass: MockMyServiceC } 
    ], 
    declarations: [ MyComponent ] 
}); 

そうでない場合は、あなたが直接MockServicesを注入するだけでなく、useClass経由でそれらを提供しているポイントに来ます。あなたのコンポーネントがMyServiceQを注入する場合、あなたのテストで何が起こるかを考えてください。

+0

私はそれを試して、あなたに結果を知らせるでしょう。ありがとうございます – mperle

+0

私は質問があります。上記の解決策は私がMockMyServiceCでこれを行ったとしても動作します 'this.mockMyServiceQ = new MockMyServiceQ();' DIの代わりにコンストラクタパラメータ – mperle

+0

あなたがこれを行った場合、あなたのアプローチがうまくいくかどうか?おそらく、あなたがそれを注射しなければ。 – lexith

関連する問題