這是你原來的片斷:
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