2016-12-05 63 views
0

测试派生类中如何重写基类的行为吗?如何覆盖基本抽象类的行为?

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

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

我想设置为DoStuff()的返回值,这可能吗?

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

注意'MethodToTest()'返回一个字符串,因此'== TRUE'将永远是假的。 –

+0

@DStanley谢谢!纠正。从UsageController –

+1

继承,覆盖DoStuff()方法和测试你的子类 – user1681317

回答

3

测试派生类中如何重写基类的行为吗?

通过实际覆盖它。只要UsageController不密封。

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

从派生类继承,并在测试中使用存根

[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); 
} 

UPDATE:

它通过当你删除base并调用实例方法

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

这是有道理的,因为如果我没有记错正确的指导方针建议应在覆盖内调用。

base (C# Reference)

+1

这会工作,但它实际上是在UsageController的基类中的虚方法称为BaseController –

+0

岂不是也行,只是覆盖UsageController DoStuff(),而不必从UsageController继承? –

+0

该方案是一个单元测试,所以OP希望能够改变DoStuff的结果测试用例的目的。 – Nkosi