0

StreamWriterを使用してファイルに書き込むクラスがあります。

public void CreateLog(string errorLogFilePath, StringBuilder errorLogBuilder, string errorMessage)
{
    using (StreamWriter sw = new StreamWriter(errorLogFilePath, true)
    {
        errorLogBuilder.Apend("An error was discovered.");
        //....
        sw.Write(errorLogBuilder.ToString());
    }
}

【質問】

1:.Write()メソッドが呼び出されていることを確認できますか?

2:実際にハードドライブにアクセスせずに、StreamWriterをテストするためにMemoryStreamをStreamWriter内にラップする必要がありますか?StreamWritersコンストラクターの1つはストリームを受け入れますが、次のように述べています+ UTF-8エンコーディングはこれに影響しますか?

UTF-8エンコーディングとデフォルトのバッファサイズを使用して、指定されたストリームのStreamWriterクラスの新しいインスタンスを初期化します。

3:クラスが実際にHDにアクセスしていて、モックする必要があるかどうかをどのように判断しますか?(この最後の質問がばかげているように聞こえたら申し訳ありませんが、これには本当に少し戸惑っています。)

4

3 に答える 3

3

メソッドが StreamWriter ではなく TextWriter に書き込むようにします。次に、メソッドにモック TextWriter を渡してテストします。もちろん、「実際の」コードでは、 を使用して作成された StreamWriter を渡しますnew StreamWriter(errorLogFilePath, true)

これにより、質問に対する次の回答が得られます。

  1. はい
  2. いいえ
  3. 通常、そのコードを逆コンパイルしないと、それを判断することはできません。

もう少し詳しく:

メソッドを 2 つのメソッドにリファクタリングします。

public void CreateLog(string errorLogFilePath, StringBuilder errorLogBuilder, string errorMessage) 
{ 
    using (StreamWriter sw = new StreamWriter(errorLogFilePath, true) 
    {
        CreateLog(sw, errorLogBuilder, errorMessage); 
    } 
} 

public void CreateLog(TextWriter writer, StringBuilder errorLogBuilder, string errorMessage)
{
    errorLogBuilder.Apend("An error was discovered."); 
    //.... 
    writer.Write(errorLogBuilder.ToString()); 
}

最初のメソッドをテストして、適切に構築された StreamWriter で 2 番目のメソッドを呼び出すことを確認します。2 番目のメソッドをテストしてWrite、適切な引数を使用して、渡された TextWriter で呼び出すことを確認します。これで、ハード ドライブへの依存関係が抽象化されました。テストではハード ドライブを使用しませんが、すべてをテストしています。

于 2012-09-11T09:40:33.980 に答える
1

一般的に言えば、次のことができます。

十分にテストされたロギング ライブラリ (NLog、MS Logging Application Block など) を使用し、独自の開発と保守を惜しみません。

ロギング ロジック (またはメッセージ ボックスの呼び出し、ファイル ダイアログを開くコードなど) を、そのインターフェイスを使用してサービスにリファクタリングします。このようにして、テスト戦略を分割できます。

  • ロギング サービスのコンシューマーをテストする場合: ロギング インターフェースをモックして、ログ メソッドが呼び出されることを確認します。これにより、ロギング サービスのコンシューマによってロギングが正しく呼び出されることが保証されます。
  • ロギング サービスの実装をテストするときは、予想される出力が与えられた入力と一致することを確認してください。「FOO」を bar.log に書き込みたい場合は、効果的に呼び出す

いいえ:

// arrrange
File.Delete("bar.log")

// act
CreateLog("bar.log", errorLogBuilder, "FOO")

// assert
Assert.IsTrue( File.Exists("bar.log") )
Assert.IsTrue( File.ReadAllLines("bar.log").First() == "FOO")

ポイントは、コンポーネントが呼び出されていることを確認することです。これは、モックによって行われます。次に、コンポーネントが期待どおりに動作することを確認できます。

于 2012-09-11T09:51:18.557 に答える