6

テストで次のコードを実行すると、

Mock<XmlWriter> mockXmlWriter = new Mock<System.Xml.XmlWriter>();
Language language = Language.GetLangauge(langId);
language.WriteXml(mockXmlWriter.Object);
mockXmlWriter.Verify(writer => writer.WriteAttributeString("ID", language.LanguageID.ToString()));

Moqは当然のことながら次の例外をスローしますSystem.NotSupportedException : Invalid verify on a non-virtual (overridable in VB) member: writer => writer.WriteAttributeString("ID", .language.LanguageID.ToString())

愚かな抽象には、 :(XmlWriterのような非抽象、非仮想メソッドがまだいくつかありますWriteAttributeString()

and Co.と同じように、XmlWriterBaseまたはを探しましたが、何も見つかりませんでした:(System.Xml.AbstractionsHttpContext

これをどのように克服して、自分のWriteXmlメソッドが想定どおりに動作していることをテストできるようにしますか?

4

1 に答える 1

5

経験則として、所有していないクラスをモックアウトすることはお勧めできません。クラスを完全に制御できず、問題(自分のクラスなど)が発生する可能性があるためです。

XmlWriterここでは、出力をに書き込みMemoryStream、ストリームに期待されるXMLが含まれていることを単に表明する実数を安全に使用できると思います。

// arrange
MemoryStream underlyingStream = new MemoryStream();
XmlWriter xmlWriter = XmlWriter.Create(underlyingStream);
Language language = Language.GetLangauge(langId);

// act
language.WriteXml(xmlWriter);

// assert
underlyingStream.Position = 0;
using (StreamReader streamReader = new StreamReader(underlyingStream)
{
    string createdXml = streamReader.ReadToEnd();
    Assert.That(createdXml, Is.EqualTo("expectedXml"));
}

アサーション部分は、ヘルパーメソッドにうまくリファクタリングできます。最近、XML作成を扱うコードを書いたので、かなりひどく焼けてしまいました。最初は、テストはモックベースで本質的に、本番コードの正確なコピーでした。幸いなことに、途中で、すべてを私の例のようなスタイルにリファクタリングすることにしました。これは本当に役に立ちました。テストの脆弱性が大幅に低下し、すべてがシンプルになりました。

于 2012-12-13T19:25:24.643 に答える