我有一个方法,其中它调用.NET XDocument.Load()方法以从URL加载xml数据。我想让我的班级单元可以测试。

那么如何使该调用成为可模拟的/可测试的呢?

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


我使用的一种解决方案是将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
}


有什么更好的办法吗?

最佳答案

我同意注入装载程序是正确的方法,我不确定为什么它将是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
}


但是我认为出于关注点分离的原因,文档加载器绝对应该属于其自己的类。

关于c# - 有依赖关系时如何设计可模拟性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15687631/

10-10 07:57