6

xmlファイルを読み取り、その内容を解析するクラスの単体テストを作成する必要があります。ファイルの読み取りをモックするにはどうすればよいですか?テストのすべての内容が読み取りファイルに対して行われる必要があるためです。

nUnitでnmock2を使用します。

ありがとう

4

2 に答える 2

7

rwwildenが示唆しているように、ファイル名ベースのAPIの代わりにストリームベースのAPIを使用すると、作業がはるかに簡単になります。ここでは、モッキングを使用することはそれほど適切ではありません、IMO。「プロトコルテスト」を行っているのではなく、データソースが必要なだけです。

単純なユーティリティメソッドであるオーバーロードを提供することもできます。

 public Result ParseXml(string file)
 {
     using (Stream stream = File.OpenRead(file))
     {
         return ParseXml(stream);
     }
 }

そうすれば、そのメソッドを合理的に安全にテストできなくなります。結局のところ、このメソッドには重要なロジックが含まれていません。

これで、コードでハードコードされた文字列を使用してストリームベースのAPIをテストし、結果のバイト配列を呼び出して構築することができます...しかし、私は通常、テストプロジェクトで個別のデータファイルを使用することを好みます。コンテンツタイプを「埋め込みリソース」に設定してから、を使用してテストファイルへのストリームを取得します。Encoding.UTF8.GetBytes(xml)MemoryStreamAssembly.GetManifestResourceStream

ただし、これが本当に通常のXMLファイルである場合、本当に自分で解析を実行しますか?それをフレームワークに任せて、APIをDOM API、LINQ to XML、またはのいずれかで表現したくない理由はありますかXmlReader

于 2010-06-13T07:38:59.970 に答える
3

あなたがしなければならないのは、どのファイルを読むべきかをクラスに伝える方法を見つけることです。したがって、クラスの実装方法に少し依存します。最も簡単なアプローチは次のようなものです。

public class ClassToTest : IClassToTest
{
    public Result ParseXml(Stream xml)
    {
        // Parse xml and return result.
        return ...;
    }
}

[Test]
public void TestParseXml()
{
    // Get xml stream to test from somewhere.
    Stream xmlStream = ...;

    // Call method to test.
    var result = new ClassToTest().ParseXml(xmlStream);

    // Assert results.
    Assert.IsNotNull(result);
    ...
}

アイデアは、テストしているクラスに、作成したxmlファイルを提供し、どの解析結果が期待されるかを知っているということです。

于 2010-06-13T07:33:26.027 に答える