2017-10-22 4 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私はそれのモックインスタンスを作成し、そのモックインスタンスを使用して、私はその基本クラスの仮想メソッドを設定しようとすると、特定の値を返すベースクラスを嘲笑m。私がセットアップしようとしている基本クラス '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あなたは正しいです。今修正され、期待どおりに動作します。 –

関連する問題