2017-10-22 7 views
0

Moq/Nunit을 사용하여 기본 추상 클래스 Person에 moq IsAdult 메소드를 원합니다. 테스트를 실행할 때마다 기본 값 Person 클래스의 실제 메서드 IsAdult을 호출하고 설정 값을 반환하지 않습니다. 내 코드는 아래와 같습니다.단위 테스트 용 추상 클래스를 사용할 때 Moq 설정이 작동하지 않습니다.

public abstract class Person 
{ 
    public string Gender { get; set; } 
    public int Age { get; set; } 

    public virtual bool IsAdult() 
    { 
     return this.Age >= 18; 
    } 

    protected Person(string gender, int age) 
    { 
     this.Gender = gender; 
     this.Age = age; 
    } 
} 

public class Employee : Person 
{ 
    public decimal Salary { get; set; } 

    public Employee() : base("Male", 17) 
    { 
    } 

    public string ProcessSalary() 
    { 
     if (IsAdult()) 
     { 
      // process the salary 
      return "Processed"; 
     } 

     return null; 
    } 
} 

[TestFixture] 
public class PersonTest 
{ 
    [Test] 
    public void Some_Name() 
    { 
     var person = new Mock<Person>() { CallBase = true }; 
     person.Setup(x => x.IsAdult()).Returns(true); 

     var employee = new Employee(); 
     var result = employee.ProcessSalary(); 

     Assert.AreEqual("Processed", result); 
    } 
} 

이 설정을 수정하는 방법에 대한 아이디어가 있으십니까?

+0

'사람'을 사용하는 곳이 보이지 않습니다 ... 아니면 기본 클래스를 모의로 대체 할 마법을 기대합니까 ???? –

+1

(올바른 구현은 https://stackoverflow.com/questions/3539278/using-moq-to-override-virtual-methods-in-the-same-class - 오해가있는 곳이면 - 중복으로 닫으십시오.), 그렇지 않으면 실제로 설명해야 할 내용을 생각하고 이에 따라 게시물을 편집하십시오. –

+0

@AlexeiLevenkov 기본 클래스를 모의 인스턴스로 만들고 mock 인스턴스를 사용하여 기본 클래스의 가상 메서드를 설정하여 특정 값을 반환하려고합니다. 업데이트 된 질문, 설치하려고하는 기본 클래스'IsAdult' 메서드를 사용하는'ProcessSalary' 메서드를 테스트해야합니다. – rumi

답변

1
using Moq; 
using Xunit; 

namespace MockAbstractClass 
{ 
    public class EmployeeTests 
    { 
     [Fact] 
     public void IsAdultMock() 
     { 
      var employeeMock = new Mock<Employee>() { CallBase = false }; 
      employeeMock.Setup(x => x.IsAdult()).Returns(true); 

      var employee = employeeMock.Object; 
      var result = employee.IsAdult(); 
      Assert.True(result); 
     } 

     [Fact] 
     public void Some_Name() 
     { 
      var employeeMock = new Mock<Employee>() { CallBase = true }; 
      employeeMock.Setup(x => x.IsAdult()).Returns(true); 

      var employee = employeeMock.Object; 
      var result = employee.ProcessSalary(); 

      Assert.Equal("Processed", result); 
     } 
    } 
} 

Person mock Employee.IsAdult 속성을 조롱하는 대신. 이제 모든 것이 예상대로 작동합니다.

+0

다음을 시도해 보시지 않겠습니까? 제안 된 변경이 귀하의 관점에서 어떻게 작동하는지 설명하기 위해 게시물을 편집하십시오. (OP와 관련하여 문제의 샘플과이 게시물의 샘플 간에는 아무런 차이가 없습니다.) –

+1

@AlexeiLevenkov 당신이 맞았습니다. 나는 답을 엉망으로 만들었습니다. 이제는 수정되어 예상대로 작동합니다. –