2012-06-21 73 views
0

是否可以模擬出文件犀牛模擬例如來電:懲戒文件犀牛模擬電話

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,所以我能夠無論文件是否存在,都要測試下一個邏輯分支。這可能嗎?

+1

摘要,檢查您可以注入的接口。模擬界面。 – cadrell0

+0

@ cadrell0你能提供一個簡短的例子嗎? – user101010101

回答

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等按預期工作。

+0

謝謝你,根據你最後的評論我有另一個功能,獲取蒸汽等我認爲不相信.net團隊:)! – user101010101

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); 
      }