2012-11-21 2 views
42

클래스 매개 변수를 확인하려고합니다. 테스트중인 코드는 정상입니다. 버그가 테스트 중입니다.개체 매개 변수를 사용하여 Moq 확인

두 가지 방법 모두 시도했지만 두 가지 모두 실패했습니다. 두 번째 매개 변수로 전달 된 객체가 동일한 특성을 가지고에도 불구하고,

this.MockImageResizeFilter.Verify(m => m.Filter(this.UploadedFileData, new ImageFilterOptions() 
    { 
     Width = 256, 
     Height = 256, 
    })); 

항상 실패하는이 :

1 : 여기

내 시도이다. 첫 번째 매개 변수가 정상적으로 확인됩니다.

2 :

this.MockImageResizeFilter.Setup(m => m.Filter(It.IsAny<byte[]>(), It.IsAny<ImageFilterOptions>())) 
    .Callback<byte[], ImageFilterOptions>((data, options) => 
     { 
      Assert.AreEqual(this.UploadedFileData, data, "data"); 
      Assert.AreEqual(filterOptions.Width, options.Width, "Width"); 
      Assert.AreEqual(filterOptions.Height, options.Height, "Height"); 
     } 
    ); 

이 항상 전달이 실패 할 경우에도. 콜백의 Asserts는 실패하지만 예외는 외부 컨텍스트로 전달되지 않으므로 테스트가 항상 성공합니다.

내가 잘못하고있는 것을 찾도록 도와 줄 수 있습니까?

답변

66

첫 번째 시도는 달성하려는 목표에 더 가깝습니다.

Moq (아마도)는 을 사용하여 메서드에서 호출 된 ImageFilterOptions 매개 변수가 Verify 호출에서 제공 한 매개 변수와 동일한 인스턴스인지 테스트합니다.

Verify에서 new ImageFilterOptions()을 만들었 기 때문에 동일한 인스턴스가 될 수 없습니다.

이 방법으로 매개 변수 검사를 수행하는 대신 Moq의 It.Is 구문을 사용하여 매개 변수가 예상 한 것임을 확인하는 식을 제공 할 수 있습니다. 귀하의 경우에는

, 당신은 매개 변수 유형 ImageFilterOptions의 것이어야하고 모두 WidthHeight256로 설정되어 있는지 확인합니다. 당신이 할 수있는 식입니다 :

It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256) 

그래서, Verify로 호출은 다음과 같이 수 :

this.MockImageResizeFilter.Verify(m => m.Filter(
      this.UploadedFileData, 
      It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256))); 
+0

스팟, 덕분에! – rhughes

+1

사용해야하는 구문은 다음과 같습니다.'It.Is ((ImageFilterOptions p) => p.Width == 256 && p.Height == 256)'. 거기에 아무 일반 아니었다 – Nemo1024

+0

제네릭 버전 나를 위해 작동하며 API 워드 프로세서에있다 http://www.nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - 당신은 구식 버전의 Moq을 사용하고 있습니까? –

관련 문제