如何覆盖基本抽象 class 的行为?

How to override behavior of base abstract class?

如何在测试派生 class 时覆盖基础 class 行为?

public abstract BaseController
{
    public virtual bool DoStuff(){};
}

public class UsageController : BaseController
{
    public string MethodToTest()
    {
       if (base.DoStuff())
          {return "yes";}
       return "no";
    }
}

我想为 DoStuff() 设置 return 值,这可能吗?

[Test]
public void Returns_Yes_When_True()
{
     var sut = new UsageController();
     //how would I setup the behavior of DoStuff?
     Assert.That(sut.MethodToTest()=="yes");
}

How do I override base class behavior when testing the derived class?

通过实际覆盖它。前提是UsageController不封

public class TestController : UsageController {
    public override bool DoStuff(){ return true; };
}

继承派生class并在测试中使用存根

[Test]
public void Returns_Yes_When_True() {
    //Arrange
    var expected = "yes";
    var sut = new TestController();
    //Act
    var actual = sut.MethodToTest();
    //Assert
    Assert.That(expected == actual);
}

更新:

去掉base调用实例方法就通过了

public class UsageController : BaseController {
    public string MethodToTest() {
       if (DoStuff())
          {return "yes";}
       return "no";
    }
}

这是有道理的,因为如果我没记错的话,指南建议应该在覆盖中调用 base

base (C# Reference)