2017-12-17 15 views
1
내가 자식 허브에 따르면

CallBase = 사실 MOQ

CallBase = true; 
var mock = new Mock<IFoo> { CallBase = true }; 

의 개념을 이해할 수 MOQ하는 새로운 아니다

안녕 팀에서 : 더 기대 구성원을 무시하지 않는 경우 기본 클래스 구현을 호출

하지만 CallBase = true를 사용하지 않고 기본 클래스 멤버를 모의 할 수있는 테스트 케이스가 있습니다.

// Creating Base class. 
public abstract class Car 
{ 
    public virtual bool IsValidSpeed() 
    { 
     ///complex logic 
     ///returnig false just to compile code 
     return false; 
    } 
} 

// Creating child class 
public class Ferrari : Car 
{ 
    public int Speed { get; set; } 
    public void PrintSpeed(int speed) 
    { 
     if (IsValidSpeed()) 
     { 
      Speed = speed; 
     } 
    } 
} 

아래의 필기 테스트 케이스. 나는

public void MoqPracticeTest2() 
{ 
    // var mock = new Mock<Ferrari>() { CallBase = true }; 
    var mock = new Mock<Ferrari>(MockBehavior.Strict); 
    //Mocking Base class function 
    mock.Setup(x=>x.IsValidSpeed()).Returns(true); 
    //calling function which will call base function 
    mock.Object.PrintSpeed(100); 
    //calling Verify on mock object 
    mock.Verify(x => x.IsValidSpeed(), Times.Once); 
    Assert.AreEqual(mock.Object.Speed,100); //Doing Assert 
} 

아직 테스트 위의 경우는 콜백 속성을 설정하지 않고 통과 내 모의 객체에 대한 진정한 속성 CallBase을 = 설정하고 있지 않다. 여기에서 CallBase = true의 사용을 설명 해주십시오.

+0

@chirstos 나는 var mock = new Mock을 사용했다. () {CallBase = true}; // var mock = new Mock (MockBehavior.Strict); 또한 내 테스트 케이스가 통과하고있다. 나는 최신 moq dll을 사용하고있다. –

+0

이 문장도'mock.Setup (x => x.IsValidSpeed ​​())라고 가정한다. 그렇다면 기본 구현은 위와 같은 설정을 제공하지 않은 경우에만 호출되기 때문에 상당히 합리적인 것입니다. – Christos

답변

2

그냥 IsValidSpeed() 반환 true에서, Ferrari 물체의 속도가 PrintSpeed 방법을 제공하는 일이 될 것이라고 한 것으로 확인 원하기 때문에 당신의 CallBasetrue에를 설정할 필요가 없습니다.

그래서 다음과 같이 선언의 :

mock.Setup(x=>x.IsValidSpeed()).Returns(true); 

당신은 IsValidSpeed 구현 방법에 대한 세부 사항을받지 않고,이 특정 시나리오를 시뮬레이션 할 수 있습니다.

한편으로 이것을 시도해보십시오. 위의 행을 제거하고 CallBase을 true로 설정하십시오. 이번에는 어설 션이 실패한다는 것에 유의해야합니다. 이는 게시물에서 이미 언급했듯이 실제 메서드가 호출되고 false 값이 반환되기 때문입니다. 따라서이 경우 제공된 속도의 값은 Speed에 할당되지 않습니다.