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);
}
}
この設定を修正する方法はありますか?
私はあなたが '人 'の使用場所を見ません...または、あなたはいくつかの魔法がモックとベースクラスを置き換えることを期待ですか? –
(正しい実装はhttps://stackoverflow.com/questions/3539278/using-moq-to-override-virtual-methods-in-the-same-classにあります。誤解されている場合は複製してください)、そうでなければあなたが実際に説明する必要があるものについて考え、それに応じて投稿を編集します。 –
@AlexeiLevenkov私はそれのモックインスタンスを作成し、そのモックインスタンスを使用して、私はその基本クラスの仮想メソッドを設定しようとすると、特定の値を返すベースクラスを嘲笑m。私がセットアップしようとしている基本クラス 'IsAdult'メソッドを使用する' ProcessSalary'メソッドの更新が必要です。 – rumi