2017-10-24 3 views
0

(角4)アプリ:クラスのプライベートメソッドをテストすることは可能ですか?私はこのコードを持っている私のイオン3では

this.$observable.subscribe(success => { 
    if (success) { 
    this.toastCtrl.create({ 
     message: 'message, 
     duration: 3000, 
     position: 'middle' 
    }).present(); 
    } 
}); 

私がテストしたい何がtoastCtrlが呼び出されたかどうかである$observablesuccess = trueを発しています。 (なお、これはとしてはおそらくトーストを生成する際に、いくつかの遅延があるを動作しません。しかし

it('when true, show toast', done => { 
    fixture.whenStable().then(() => { 
    component.$observable.subscribe(success => { 
     if (success) { 
     fixture.detectChanges(); 
     console.log(debugElement.query(By.css('.toast-message'))); 
     done(); 
     // expect(debugElement.query(By.css('.toast-message')).nativeElement).toBeDefined(); 
     } 
    }); 
    }); 
}); 

::私はとイオンネイティブが、その要素を使用してい

これは私のテストは次のようになりますそのクラスはDOMに実際に挿入されます - 3秒間であっても100秒で試しても)

私はで非同期コードをテストしていますか?

ない場合は、はどのように私はそれがコンポーネント内の私有財産だからthis.toastCtrlは明らかに、私はできません(と呼ばれていることをテストします - それは

...としてコンストラクタに注入だとして、それが仕事を得るために必要な として
constructor(private toastCtrl: ToastController) 
+0

@トーラザブロもっと正確になりますか? – dragonmnl

+0

@estusなぜそれが重複しているのかわかりません。それは同じ概念ですが、2つの異なる視点と異なるケースからです。 – dragonmnl

+0

答えを見てください。それは、私的な方法でスパイすることについてのあなたの質問に正確に答えます。 TypeScriptにprivateメソッドがある場合、Reflect.getまたは 'component ['toastCtrl]'でアクセスできます。これはリフレクションとみなされます。 – estus

答えて

3

あなたはパススルーでspyOnを使用してテストすることができます。

また(component as any).privateMethodを試すことができます。これは、component['privateMethod']があまりにもうまくいく可能性が高いです。

プライベートメソッドがthisにアクセスする必要がない場合は、クラスの外に置くことができます。これはおそらく実行する必要があります。理論的には

jasmineが定義されている場合、あなただけの作品公開版を公開することができます:

public foo() { 
    if (!jasmine) throw new Error("can't call this unless testing!"); 
    return bar(); 
} 

private bar() { 
    return 42; 
} 

SO、この問題に対処する上で、ここで他の多くの質問、および内部をテストしようとしているの特に逆説的概念を内部、そしておそらくはブラックボックスのようなものになるはずです。

+0

この解決策(テストしようとします)のすべての点では、私が知っている限り、テストするコードに "テストコード"があることは良い考えではありません。理にかなっている? – dragonmnl

+0

最初に内部のものをテストするのは良い考えではありません。彼らは社内だから内部的だ。パブリックインターフェイスとは無関係です。パブリックインターフェイスはテストしたいものです。ユニットテストを書き直すことなく内部を変更できるはずです。誰もそれらを直接使用することはできませんので、問題はありません。私が関数 'function plus(a、b){return a + b; } 'function sum(arr){return arr.reduce(plus 0);}のように、私がsum関数で使っていたものです。 } '、' plus'のテストを書くでしょうか? –

+0

が理にかなっています。私が言ったように(明日)試してみる。大変なトラブルで非同期UIの変更をテストする価値があるかどうか、2セントを教えてください。 – dragonmnl

関連する問題