2013-12-14 6 views
3

모의 메서드를 테스트하고 싶지만이 예외가 발생합니다. 내 수업이 (이 클래스는 파일의 압축을 풀 것처럼 파일에 몇 가지 간단한 작업을 할)입니다 :Moq 오류 : Moq.MockVerificationException : 다음 설정이 일치하지 않았습니다

public class FileActions 
    { 
     public virtual void Decompress(FileInfo fileInfo, DirectoryInfo directoryInfo) 
     { 
      ZipFile.ExtractToDirectory(fileInfo.FullName, directoryInfo.FullName); 
     } 

     public virtual FileInfo GetConvertedFileToZip(FileInfo fileInfo) 
     { 
      try 
      { 
       var changeExtension = Path.ChangeExtension(fileInfo.FullName, "zip"); 
       File.Move(fileInfo.FullName, changeExtension); 
       return new FileInfo(changeExtension); 
      } 
      catch (Exception) 
      { 

       throw new FileNotFoundException(); 
      } 

     } 
    } 

을이 내 테스트입니다 : 그래서

public void TestMockedMethodForNotNull() 
    { 
     var mock = new Mock<FileActions>(); 

     var fInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg"); 
     mock.Setup(s => s.GetConvertedFileToZip(fInfo)).Verifiable(); 
     mock.VerifyAll(); 
    } 

, 왜이 오류가 않습니다

Moq.MockVerificationException : 다음 설정이 일치하지 않은 : FileActions2 S => s.GetConvertedFileToZip (D : \ ZipFiles \ elmah.nupkg)

+0

당신의 클래스는 무엇인가 "FileActions2을"성공 것인가? – Spock

+0

네,하지만 제 질문을 쓸 때가 제 실수였습니다. 그것은 중요하지 않습니다. 그럼 왜이 오류가 발생합니까? –

+0

감사합니다. 실수 였음을 깨달았습니다. :) 아래 질문에 답변했습니다. – Spock

답변

11

단위 테스트에 몇 가지 문제가 있습니다. 나는 당신이 물어 보는 질문과 관련이 있기 때문에 사물의 조롱 만 강조 할 것이다. 또한 귀하의 질문에 "FileActions2"를 참조하고, 나는이 질문을 원래 추가 할 때 실수로 라고 생각합니다.

당신 테스트 : MOQ는 가상 메서드 GetConvertedFileToZip에 대한 재정의를 제공 할 수 있기 때문에

[TestMethod] 
    public void TestMockedMethodForNotNull() 
    { 
     var mock = new Mock<FileActions>(); 

     var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg"); 

     mock.Setup(s => s.GetConvertedFileToZip(fileInfo)).Verifiable(); 

     mock.VerifyAll(); 
    } 

이 테스트를 쓴 방법, MOQ는이 테스트는 근본적으로 실패 GetConvertedFileToZip 에 확인하지 않습니다. 프록시 i, e mock.Object를 작성해야합니다.

SUT (Sysytem Under Test)가 조롱 된 개체/프록시 된 개체의 인스턴스를 사용하는 경우 확인이 부분적으로 작동합니다 (부분적으로는 올바른 방향으로 향하고 있음을 의미 함). 내가 아직 설명하지 않은 다른 문제가있다.

는 SUT 가정하면이 예외를 생성 할

[TestMethod] 
    public void TestMockedMethodForNotNull() 
    { 
     var mock = new Mock<FileActions>(); 

     var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg"); 

     mock.Setup(s => s.GetConvertedFileToZip(fileInfo)).Verifiable(); 

     var sut = new Sut(); 

     sut.Do(mock.Object); 


     mock.VerifyAll(); 
    } 

귀하의 테스트
public class Sut 
{ 
    public void Do(FileActions fileActions) 
    { 
     var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg"); 
     var s = fileActions.GetConvertedFileToZip(fileInfo); 
    } 
} 

이하 같다. 이는 Sut을 통해 호출 할 때 설정 한 fileInfo가 확인과 일치하지 않기 때문입니다.

당신이 아래이 테스트를 수정한다면,이

[TestMethod] 
    public void TestMockedMethodForNotNull() 
    { 
     var mock = new Mock<FileActions>(); 

     //var fileInfo = new FileInfo(@"D:\ZipFiles\elmah.nupkg"); 

     mock.Setup(s => s.GetConvertedFileToZip(It.IsAny<FileInfo>())).Verifiable(); 

     var sut = new Sut(); 

     sut.Do(mock.Object); 

     mock.VerifyAll(); 
    } 
"FileActions"입니다 조롱
+0

정말 고마워요. 불행히도 나는 당신의 대답에 투표 할 충분한 포인트가 없습니다. 고마워 :) –

+0

아무 문제가 없다. 새로운 사용자 일 수도 있고, 모르는 경우에이 대답이 충분하면 질문에 대한 대답으로 표시 할 수있다. 이 방법은 다른 사람들이 정답을 알 것입니다. 진드기를 클릭하기 만하면됩니다. 어쨌든 귀하의 의견을 보내 주셔서 감사합니다 :) – Spock

+0

나는 2008 년 이후 stackoverflow 회원이되어 새로운 사용자가 아니지만 내 계정을 변경하고 내 Google 계정과 연결하기로 결정했습니다. 따라서 저는 새 계정으로 새로운 사용자입니다. :) –

관련 문제