我有一个方法,其中它调用.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/