2010-02-27 5 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 메서드에 대한 기대치를 설정하고 반환해야한다고 말합니다 ("테스트"). 코드를 단계별로 실행하면 null insteaed가 반환됩니다. 여기에 내가 누락 된 아이디어가 있습니까?

여기 내에서 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()으로 전환 될 때까지 녹음 된 답변 이 다시 시작되지 않습니다. 스텁과 mock은 같은 방식으로 작동하지 않습니다. 차이점에 대해 blog post을 작성했습니다.

또한 새 배열-ACT-어설 션 구문으로 된 기록 재생 검증 구문을 혼합되어 있습니다. 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

당신이 말하는 것은 많은 의미를 가지며, 이것이 내가 여기서 무슨 일이 일어나고 있는지 이해할 수있게 도와 준다고 생각합니다. 고맙습니다! –

1

정말 정확한 문자열 @"c:\Myprogram.txt" 및 인수로 @"c:\Myprogram.txt"으로 호출되는 FileCopyDateCheck 방법을합니까? FileInfoc:\와 함께 일을하는 경우

나는 확실하지 않다. 어쩌면 그것은 대문자 C:\으로 수정되어 예상치 못한 결과를 초래할 수 있습니다.

어쩌면 인수 제한에 대한 자세한 내용은

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

값 정확한 인수에 대해 확인하지 않습니다 기대를 시도 참조 : Rhino Mocks 3.5, Argument Constraints

나는 또한 기대를 만들 가능성이 있다는 것을 확신 대소 문자를 구분하지 않습니다.

0

CopyvRAFiles() 메서드가 가상이 아니기 때문입니다.

관련 문제