这是你原来的片断:
private ServerConnection LoadConnectionDetailsFromDisk(string flowProcess)
{
var appPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
var bodyFile = Path.Combine(appPath, @"XML\ServerConnections.xml");
if (File.Exists(bodyFile))
{
//more logic
}
}
而不是使用System.IO库(这是不可能的嘲笑),cadrell已基本说来添加一个抽象层,你可以嘲笑:
现在
private ServerConnection LoadConnectionDetailsFromDisk(string flowProcess)
{
var appPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
var bodyFile = Path.Combine(appPath, @"XML\ServerConnections.xml");
if (FileExists(bodyFile))
{
//more logic
}
}
public bool FileExists(bodyFile) { return File.Exists(bodyFile) }
,在您的测试,你可以定义使用大部分现有的代码的PartialMock(允许你进行测试),但允许您覆盖只是FILEEXISTS方法:
var myPartialMock = mockRepo.PartialMock(typeof(MyObject));
myPartialMock.Expect(m=>m.FileExists("")).IgnoreArguments().Return(true);
myPartialMock.LoadConnectionDetailsFromDisk("myProcess");
现在,您的if语句中的调用总是返回true。
其他要考虑的事情;我看到一个if块是以文件的存在为基础的。您没有指定代码,但我会打赌别人,但你(因为你可以更改代码)代码打开或操纵我们现在知道存在的文件。所以,整个方法都会碰到你能够和不能进行单元测试的边界。您可以考虑重构此方法以从另一个函数获取Stream(允许您嘲笑该函数并向测试数据注入MemoryStream),但是在某些时候,您会刮掉“沙箱”的边缘,只需要相信.NET团队完成了他们的工作,并调用File.Exists,File.Open等按预期工作。
摘要,检查您可以注入的接口。模拟界面。 – cadrell0
@ cadrell0你能提供一个简短的例子吗? – user101010101