2013-12-11 4 views
2

조롱이 왜 이런 식으로 행동하는지 이해하려고합니다. (Moq과 함께 NUnit을 사용하고 있습니다.) 우리는 간단한 클래스가,의가 있다고 가정 해 봅시다 :다른 생성자를 사용하여 객체 조롱

public class Package 
{ 
    public virtual int PackageId { get; set; } 

    public Package() 
     :this(-1) 
    { 
    } 

    public Package(int packageId) 
    { 
     PackageId = packageId; 
    } 
} 

그리고 몇 가지 간단한 테스트를 논의하기 :

[TestFixture] 
public class NUnitTrickyTest 
{ 
    private const int SamplePackageId = 10; 

    [Test] 
    public void TestPackageSetUp_WhenMockedWithDefaultConstructor_ExpectSamplePackageIdSet() 
    { 
     var samplePackage = new Mock<Package>(); 

     samplePackage.SetupProperty(x => x.PackageId, SamplePackageId); 

     Assert.AreEqual(SamplePackageId, samplePackage.Object.PackageId); 
    } 

    [Test] 
    public void TestPackageSetUp_WhenMockedWithParametrizedConstructor_ExpectSamplePackageIdSet() 
    { 
     var samplePackage = new Mock<Package>(SamplePackageId); 

     // samplePackage.SetupProperty(x => x.PackageId, SamplePackageId); 

     Assert.AreEqual(SamplePackageId, samplePackage.Object.PackageId); 
    } 
} 

첫 번째 테스트가 samplePackage.Object.PackageId -1을 반환, 예상대로되지 10로 실패합니다. Package()은 기본 -1로 속성을 초기화하는 매개 변수화 된 생성자를 호출합니다. 두 번째 테스트에서 samplePackage.Object.PackageId은 0을 반환합니다.

왜 0이 반환되었는지 (디버그에서 나는 생성자에서 10이 전달되지만 속성은 0 값인 것으로 나타났습니다) 이유를 이해하지 못합니다. 두 번째 테스트 : 두 번째 테스트에서이 명령의 주석을 해제하면 samplePackage.SetupProperty(x => x.PackageId, SamplePackageId)이 성공합니다. 그런데 왜 SetupProperty이 그 경우 (속성은 10을 반환합니다) 예상 한대로 동작하고 첫 번째 테스트에서 그런 식으로 작동하지 않는 이유는 무엇입니까?

도와 주시겠습니까? 이것은 내 첫 게시물이므로 심각하지는 마십시오 :)

답변

7

모든 mockable (virtual) 메소드는 기본적으로 프록시를 사용하므로 두 번째 테스트에서는 기본값 (0)이 사용됩니다 (프록시는 그렇지 않습니다). 세트). 당신은 당신의 모의에 CallBase = true을 설정함으로써이 문제를 해결할 수 있습니다.

CallBase = true은 모든 것을 조롱하지 않고 기본 구현을 사용합니다.

처음 실패한 이유를 알아 내는데 두 번째 걸렸습니다. SetupProperty은 기본값을 사용하여 추적 만 켜기 때문에 생성자에서이 기본값을 재정의하므로 사용. 값을 강제로 사용하려면 Setup(x=>x.PackageId).Returns(SamplePackageId) 또는 SetupGet

+0

을 사용해야합니다. CallBase 설정에 대한 참고 사항 –

+0

감사합니다. 그러나 첫번째 것은 실패합니다. PackageId는 생성자에 의해 -1로 초기화되고 .SetupProperty는 조롱 된 객체에 대해 'override'하지 않습니다. – Artem

+0

조금 더 깊이 생각하고 대답을 업데이트했습니다. 나는 진실로 검증하기 위해 소스 코드에 가야 할 것이지만, 나는 확실히 나의 대답을 확신하고있다. –

관련 문제