1

このメソッドの単体テストの作成を開始する方法さえ途方に暮れています。

public override void ModifyXmlDocument(Foo foo, string nodeToChange, string newValue)
{
    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.Load(foo.XmlPathAndFileName);
    XmlElement rootElement = xmlDocument.DocumentElement;
    // rest of method (to modify an XML doc) here
}

このメソッドは、単純に XML ドキュメント内の要素/ノードを見つけて、ユーザーが指定した値で更新します。(この方法は、ここに示すものよりも複雑です。)

私が苦労している部分は、ハードディスクに依存せずにこのメソッドを実行する方法を理解することです。ただしxmlDocument.Load()、ファイル パスを取り、ディスクからファイルをロードします。メソッドの最後に、更新されたファイルをディスクに保存します。

このメソッドを単体テスト可能にするにはどうすればよいですか?

4

2 に答える 2

6

これを行う方法はいくつかありますが、いずれもコードのリファクタリングが必要です。ModifyXmlDocumentパラメータとして取る必要がありXmlDocument、そこからモックすることができます。

public void test_that_xml_is_loaded()
{
    var sut = new SUT();
    var xmldocumentfake = new Mock<XmlDocument>(){CallBase=true};
    xmldocumentfake.Setup(x=>x.LoadXml(It.IsAny<String>()));

    sut.ModifyXmlDocument(foo, nodeToChange, newValue, xmlDocumentfake.Object);

   xmldocumentfake.Verify(x=>x.LoadXml(It.IsAny<String>()), Times.Once());
}

XmlDocument変更可能な抽象化として記述できる別のクラスにラップすることもできます。ただし、繰り返しますが、それを渡す必要があります。

また、アンソニー・ペグラムがほのめかしたように、私が言いたいことは、単一責任の原則を破っていないことに注意してください。テストを書くのが難しすぎる場合、それはしばしばその原則を破ったという悲鳴です。

于 2013-04-05T02:22:53.077 に答える
1

いくつかのオプション:

  • VS2012 Ultimate を使用している場合は、Fakes を使用して、XmlDocument がファイルを開くときの動作をオーバーライドする shim を作成できます。
  • テストするときは、単体テストでサンプル XML ファイルをデプロイします。次に、Foo インスタンスを渡すときに、そのファイルへのパスを使用します。
  • ストリームや XmlReader を受け取るものなど、XmlDocument.Load の代替手段の 1 つを試してください。次に、オーバーライドできるメソッドでそれを作成します。
于 2013-04-05T02:24:36.640 に答える