コード以外のものをテストするのに時間を無駄にするべきではないと思います。基盤となるフレームワークのエラーを処理するか、呼び出し元に伝播させるかは、テストの選択ではなく、設計上の選択です。FWIW、私はあなたがそれらを繁殖させるのは正しいと思います。ただし、設計上の決定を下したら、単体テストでは、基盤となるフレームワークをテストせずに、コードをカバーする(そして十分にカバーする)必要があります。依存性注入とモックストリームを使用することもおそらく良い考えです。
[編集]依存性注入の例(詳細については上記のリンクを参照)
依存性注入を使用しない場合:
public class CvsReader {
private string filename;
public CvsReader(string filename)
{
this.filename = filename;
}
public string Read()
{
StreamReader reader = new StreamReader( this.filename );
string contents = reader.ReadToEnd();
.... do some stuff with contents...
return contents;
}
}
依存性注入(コンストラクター注入)では、次のことを行います。
public class CvsReader {
private IStream stream;
public CvsReader( IStream stream )
{
this.stream = stream;
}
public string Read()
{
StreamReader reader = new StreamReader( this.stream );
string contents = reader.ReadToEnd();
... do some stuff with contents ...
return contents;
}
}
これにより、CvsReaderをより簡単にテストできるようになります。コンストラクターで依存するインターフェース(この場合はIStream)を実装するインスタンスを渡します。このため、IStreamを実装する別のクラス(おそらくモッククラス)を作成できますが、必ずしもファイルI/Oを実行する必要はありません。このクラスを使用して、基盤となるフレームワークを一切使用せずに、必要なデータをリーダーにフィードできます。この場合、MemoryStreamから読み取るだけなので、MemoryStreamを使用します。ただし、モッククラスを使用して、テストで提供される応答を構成できる、よりリッチなインターフェイスを提供することもできます。このようにして、作成したコードをテストでき、基盤となるフレームワークコードはまったく含まれません。または、TextReaderを渡すこともできます。しかし、通常の依存性注入パターンはインターフェースを使用しているので、インターフェースを使用してパターンを表示したいと思いました。上記のコードは依然としてStreamReaderの実装に依存しているため、おそらくTextReaderを渡す方がよいでしょう。