是否可以使用rhino模拟示例模拟文件调用:
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
}
所以我试图模拟File.Exists方法,因此它将返回true,所以我能够测试逻辑的下一个分支,无论文件是否存在。这可能吗?
答案 0 :(得分:1)
这是您的原始代码段:
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等按预期工作。
答案 1 :(得分:0)
使用界面抽象它。
public Interface IFileChecker
{
bool FileExists(string path)
}
然后使用界面创建模拟对象。
IFileChecker fileChecker = mocks.Stub<IFileChecker>();
using (mocks.Record())
{
fileChecker.Stub(i => i.FileExists(Arg<string>.Is.Any)).Return(true);
}