Q1:
あなたのテストでは、このような何かを見に行くされています。
オプション1:それと一緒に生きてください。
(NO例:P)
オプション2:必要なわずかな抽象化を作成します。
テスト中のメソッドでファイルI/O(File.ReadAllBytesなど)を実行する代わりに、IOが外部で実行され、代わりにストリームが渡されるように変更できます。
public class MyClassThatOpensFiles
{
public bool IsDataValid(string filename)
{
var filebytes = File.ReadAllBytes(filename);
DoSomethingWithFile(fileBytes);
}
}
は、このアプローチは、トレードオフである
// File IO is done outside prior to this call, so in the level
// above the caller would open a file and pass in the stream
public class MyClassThatNoLongerOpensFiles
{
public bool IsDataValid(Stream stream) // or byte[]
{
DoSomethingWithStreamInstead(stream); // can be a memorystream in tests
}
}
なります。まず、はい、それはもっとテスト可能です。しかし、それはテスト容易性と僅かな複雑さを加えています。メンテナンス性とコードの書き方を損なうことがあります。さらに、テストの問題を1段階上に進めることもできます。
私の経験では、完全にラップされたファイルシステムにコミットせずに、重要なロジックを一般化してテスト可能にすることができます。私。残りの部分をそのまま残しながら、本当に気にしているビットを一般化することができます。
オプション3:ステップさらにそれを取っ
ファイルシステム全体をラップし、ファイルシステムをモックする有効なアプローチであることができます。それはあなたがどれほど鼓動しているかによって決まります。
私はこれまでにこのルートを行ってきました。私はラップされたファイルシステムの実装を持っていましたが、結局私はそれを削除しました。APIに微妙な違いがありました。私はどこにでも注入しなければならず、最終的には、それを使用するクラスの多くが私にとって非常に重要ではなかったので、少しの利益のために余分な痛みでした。私がIoCコンテナを使用していたり、クリティカルなものを書いていて、テストが速くなければならなかった場合、私はそれに固執していたかもしれません。これらすべてのオプションと同様に、あなたの走行距離は異なる場合があります。あなたのIoCコンテナの質問については
:
手動テストダブルを注入します。反復作業を頻繁にやる必要がある場合は、テストでsetup/factoryメソッドを使用してください。 IoCコンテナをテスト用に使用することは、極端な場合には過剰です。おそらく私はあなたの2番目の質問を理解していないでしょう。
。 –
DI **の期間**を使用することをお勧めします([この記事](http://blog.ploeh.dk/2011/05/24/PokayokeDesignFromSmellToFragrance.aspx)とそれがリンクしているものを参照してください) –