2016-10-27 3 views
1

JavaScriptで型に注釈を付けるためにflowtypeを使用しています。私のテストでは、私もflowtypeを利用したいと思っています。実装されたモックの半分をflowtypeの型にキャストできますか?

私は、関数に別の関数を持つオブジェクトである引数が与えられていること、そしてこの他の関数が期待される引数で正しい回数呼び出されていることをテストしています。

例コード:

function foo(obj: Bar) { 
    obj.bar('bar'); 
} 

例のテスト:

test('foo gets bar', t => { 
    const mockBar: Bar = { 
     bar: sinon.stub(), 
    }; 
    foo(mockBar); 
    t.true(mockBar.bar.calledWith('bar')); 
}); 

Barプロパティと、そのようなたくさんの、本当に複雑なタイプがあり、完全に模擬することは容易ではないので、ここで私が唯一にしたいですテストは'bar'となります。 Flowtypeにはこれがなく、私のmockBarは実際にはBarではないことがわかりました。テスト時にflowtypeを使用したり、モックアウトしない以外は、この時点で何をすべきか分かりません。少しのテストのために。

私は単に何とか強制的にモックをキャストして、バーを邪魔にならないようにすることができますか?

答えて

6

実は、私はより良い解決策を見つけたかもしれません。

// Upcast mockBar to any then downcast any to Bar. 
// Unsafe downcasting from any is allowed: OK 
((mockBar: any): Bar); 

上記の式は、タイプがBarです。

出典:https://flowtype.org/blog/2015/02/18/Typecasts.html

このアプローチの利点は、唯一の型キャストエラーは無視されるということです。例:存在しない変数が依然として検出される。

+0

これはうまくいきました。私はこれを次のように渡さなければなりませんでした: 'foo(((mockBar:any):Bar)));' –

0

フローのエラー抑制コメントを使用して、エラーを無視できます。コメントパターンは.flowconfigに定義する必要があります。 docsから

suppress_comment(正規表現)は、次の行の任意のフローエラーを抑制魔法のコメントを定義します。たとえば:

suppress_comment= \\(.\\|\n\\)*\\$FlowFixMe

は、このようなコメントを一致します。

// $FlowFixMe: suppressing this error until we can refactor 
var x : string = 123; 
+0

これを実行した場合、テストからのフローを使用しないこともできます。私は本当にキャストする方法を望んでいた。 –

+1

@BjornTiplingどの変数も '(myVar:Type)'のような任意の型にキャストすることができます。しかし、あなたの例では新しい変数を定義しているので、キャストする必要はありません。必要な型を指定するだけで済みます。あなたが必要なフィールドを実装していないので、キャスティングとあなたの望むものの両方があなたのケースでタイプチェックに失敗します。だから、それを動作させるには、そのキャストまたは宣言の型チェックをオフにする必要があります。これを可能にする言語機能は、タイプシステムのエラーを効果的に抑制します。エラー抑制コメントは、1行のエラーだけを消すことに注意してください。 – Nikita

関連する問題