3

URLからxmlデータをロードするために.NET XDocument.Load()メソッドを呼び出すメソッドがあります。クラスを単体テスト可能にしたい。

では、その呼び出しをモック可能/単体テスト可能にする方法は?

private void ProcessData(string url)
{
            // todo: make this mockable
            var xDocument = XDocument.Load(url);
            // the rest of the code
}

私が使用した 1 つの解決策は、以下のように xmlUrlLoader をクラスに挿入することです。

private readonly Func<string, XDocument> _xmlUrlLoader;

public MyConstructor(Func<string,XDocument> xmlUrlLoader)
{
    _xmlUrlLoader = xmlUrlLoader;
}
private void ProcessData(string url)
{
            // todo: make this mockable
            var xDocument = this._xmlUrlLoader(url);
            // the rest of the code
}

もっと良い方法はありますか?

4

2 に答える 2

3

リソースへのアクセスからロジックを分離することを好みます。あなたの場合、ドキュメントを処理関数に渡します。

void ProcessData(XDocument xDocument);

何もモックせずにその関数をテストできます。次に、必要に応じて、読み込みを行う薄いラッパーを上に追加できます。

void ProcessUrl(string url);
{
    var xDocument = XDocument.Load(url);
    ProcessData(xDocument);
}

モックを使用してラッパーの単体テストを行うことができますが、個人的にはあまり効果がありません。これらのラッパーは、統合テストの一部としてのみ実行することを好みます。

于 2013-03-28T17:02:23.473 に答える
3

ローダーの注入が正しいアプローチであることに同意します。なぜそれが Func 型になるのかわかりません

次のようなインターフェイスを期待します

public interface IXmlDocumentLoader
{
    XDocument LoadDocument(string url);
}

そして、あなたのコードは次のようになります

private readonly IXmlDocumentLoader _xmlUrlLoader;

public MyConstructor(IXmlDocumentLoader xmlUrlLoader)
{
    _xmlUrlLoader = xmlUrlLoader;
}

private void ProcessData(string url)
{
            var xDocument = this._xmlUrlLoader(url);
            // the rest of the code
}

しかし、懸念事項を分離するという理由から、ドキュメント ローダーは確実に独自のクラスにする必要があると思います。

于 2013-03-28T16:55:41.987 に答える