2010-02-27 22 views
2

我花了一天中的很大一部分時間試圖找出爲什麼簡單的RhinoMocks測試不會返回我在返回中設置的值。我確信我只是錯過了一些非常簡單的事情,但我無法弄清楚。這是我的測試:RhinoMocks AAA語法

[TestMethod] 
    public void CopyvRAFiles_ShouldCallCopyvRAFiles_ShouldReturnTrue2() 
    { 
     FileInfo fi = new FileInfo(@"c:\Myprogram.txt"); 
     FileInfo[] myFileInfo = new FileInfo[2]; 
     myFileInfo[0] = fi; 
     myFileInfo[1] = fi; 
     var mockSystemIO = MockRepository.GenerateMock<ISystemIO>(); 
     mockSystemIO.Stub(x => x.GetFilesForCopy("c:")).Return(myFileInfo); 
     mockSystemIO.Expect(y => y.FileCopyDateCheck(@"c:\Myprogram.txt", @"c:\Myprogram.txt")).Return("Test"); 
     CopyFiles copy = new CopyFiles(mockSystemIO); 

     List<string> retValue = copy.CopyvRAFiles("c:", "c:", new AdminWindowViewModel(vRASharedData)); 
     mockSystemIO.VerifyAllExpectations(); 
    } 

我有我的SystemIO類的接口我傳遞給我的CopyFiles類的模擬。我對我的FileCopyDatCheck方法設置了一個期望,並說它應該返回(「Test」)。當我遍歷代碼時,它會返回一個空值。任何想法,我在這裏失蹤?

這裏是我的CopyFiles類的方法:

public List<string> CopyvRAFiles(string currentDirectoryPath, string destPath, AdminWindowViewModel adminWindowViewModel) 
    { 
     string fileCopied; 
     List<string> filesCopied = new List<string>(); 
     try 
     { 
      sysIO.CreateDirectoryIfNotExist(destPath); 

      FileInfo[] files = sysIO.GetFilesForCopy(currentDirectoryPath); 

      if (files != null) 
      { 
       foreach (FileInfo file in files) 
       { 
        fileCopied = sysIO.FileCopyDateCheck(file.FullName, destPath + file.Name); 
        filesCopied.Add(fileCopied); 
       } 
      } 

      //adminWindowViewModel.CheckFilesThatRequireSystemUpdate(filesCopied); 

      return filesCopied; 
     } 
     catch (Exception ex) 
     { 
      ExceptionPolicy.HandleException(ex, "vRAClientPolicy"); 
      Console.WriteLine("{0} Exception caught.", ex); 

      ShowErrorMessageDialog(ex); 
      return null; 
     } 
    } 

我認爲「fileCopied」必須由期望設定的返回值。 GetFilesForCopy返回myFileInfo中的兩個文件。請幫忙。 :)

在此先感謝!

回答

7

模擬不會開始返回記錄的答案,直到它切換到重播模式Replay()。存根和嘲諷不能以相同的方式工作。我寫了一個關於差異的blog post

另請注意,您正在將舊的record-replay-verify語法與新的arrange-act-assert語法混合使用。用AAA,你不應該使用模擬和Expect。相反,使用存根和AssertWasCalled這樣的:

[TestMethod] 
public void CopyvRAFiles_ShouldCallCopyvRAFiles_ShouldReturnTrue2() 
{ 
    // arrange 
    FileInfo fi = new FileInfo(@"c:\Myprogram.txt"); 
    FileInfo[] myFileInfo = new FileInfo[2]; 
    myFileInfo[0] = fi; 
    myFileInfo[1] = fi; 

    var stubSystemIO = MockRepository.GenerateStub<ISystemIO>(); 
    stubSystemIO.Stub(
     x => x.GetFilesForCopy(Arg<string>.Is.Anything)).Return(myFileInfo); 
    stubSystemIO.Stub(
     y => y.FileCopyDateCheck(
      Arg<string>.Is.Anything, Arg<string>.Is.Anything)).Return("Test"); 

    CopyFiles copy = new CopyFiles(mockSystemIO); 

    // act 
    List<string> retValue = copy.CopyvRAFiles(
     "c:", "c:", new AdminWindowViewModel(vRASharedData)); 

    // make assertions here about return values, state of objects, stub usage 
    stubSystemIO.AssertWasCalled(
     y => y.FileCopyDateCheck(@"c:\Myprogram.txt", @"c:\Myprogram.txt")); 
} 

注意如何建立在開始存根的行爲是在最後的斷言分開。 Stub沒有設定任何預期。

分離行爲和斷言的優勢在於,您可以減少每次測試的斷言,從而更容易診斷測試失敗的原因。

+0

你在說什麼很有意義,我認爲這真的幫助我理解這裏發生了什麼。謝謝! – 2010-03-01 17:59:35

1

是否FileCopyDateCheck真正得到所謂與確切@"c:\Myprogram.txt"@"c:\Myprogram.txt"作爲參數的方法?

我不確定FileInfo是否正在與c:\做某些事情。也許它被修改爲大寫C:\,這會讓你的期望不起作用。

也許嘗試不檢查的確切參數的期望值

mockSystemIO.Expect(y => y.FileCopyDateCheck(Arg<string>.Is.Anything, Arg<string>.Is.Anything)).Return("Test"); 

有關參數約束的更多詳細信息,請參閱:Rhino Mocks 3.5, Argument Constraints

我敢肯定,也有可能使預期不區分大小寫。

0

我認爲這是因爲你的CopyvRAFiles()方法不是虛擬的。