【发布时间】:2013-03-28 16:49:29
【问题描述】:
我有一个方法,它调用 .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
}
有没有更好的办法?
【问题讨论】:
-
我会将加载 url 的责任上移一级。因此,有一个函数将数据作为字符串或
XDocument进行处理,然后对其进行薄包装,下载数据并将其传递给处理函数。无需嘲笑。 -
如果我在哪里,我只需将 xDocument 传递给此方法。
-
@KirillBestemyanov 我无法将 xDocument 传递给它;我不想调用 xDocument.Load,它应该被模拟/隔离。
-
XDocument.Load不接受网址,它只接受文件名。那么你的代码到底是如何工作的呢? -
@CodesInChaos 不,它接受 Uri(本地或外部); msdn.microsoft.com/en-gb/library/bb343181.aspx 这是通过网络加载 Xml 文件的最简单方法 :)
标签: c# asp.net unit-testing mocking tdd