繁体   English   中英

如何模拟抽象基类

[英]How to mock An Abstract Base Class

我有一个名为“Question”的基类和几个子类,例如“TrueFalse”、“MultipleChoice”、“MatchPairs”等......

基类具有所有子类都使用的具有逻辑的方法,例如发送分数和引发事件。

我已经为子类设置了单元测试,但我不确定如何为基类中的方法设置单元测试。

我做了一些搜索,我知道我需要创建一个类的 Mock,但我不知道如何做到这一点,因为我只看到了如何在可实例化的对象上做到这一点。

我在项目中安装了 Moq 和 NUnit,所以理想情况下我喜欢使用它。 我还是编程新手,这是我第一次添加单元测试,所以我很感激你能给我的任何建议。

我首先在网站上进行了搜索,发现了几个类似的问题,但他们没有给出任何关于如何做的示例,只是需要对其进行模拟。

非常感谢。

这个答案看来,您需要的是以下方面的内容:

[Test]
public void MoqTest()
{
    var mock = new Moq.Mock<AbstractBaseClass>();            
    // set the behavior of mocked methods
    mock.Setup(abs => abs.Foo()).Returns(5);

    // getting an instance of the class
    var abstractBaseClass = mock.Object;
    // Asseting it actually works :)
    Assert.AreEqual(5, abstractBaseClass.Foo());
}

我试图模拟一个抽象类,但这种方式对我不起作用。 所做的工作是创建一个扩展抽象类的新类

class newclass : abstractClass
{
}

像这样我可以设置属性并测试主要方法

没有简单的方法可以测试它,

最好的选择是:

  • 将基类方法标记为虚拟
  • 为每个“TrueFalse”、“MultipleChoice”、“MatchPairs”类创建测试类,虚拟方法被覆盖并调用公共抽象方法。

所以例如你有下一个继承结构

class Question {
     protected virtual bool CheckCorrect(params int[] answers){
          return answers.Any(x => x== 42);
     }
}

class TrueFalse: Question {
     
     public int SelectedAnswer {get;set;}
     public bool IsCorrect(){
          return CheckCorrect(SelectedAnswer );
     }
}
class MultipleChoice: Question {
     public int[] SelectedAnswers {get;set;}
     public bool IsCorrect(){
          return CheckCorrect(SelectedAnswers );
     }
}

测试方法:

abstract class TrueFalseTest: TrueFalseTest{

     public abstract bool CheckCorrectReal(params int[] answers);
     
     public override bool CheckCorrect(params int[] answers){
          return CheckCorrect(SelectedAnswer );
     }
}

abstract  class MultipleChoiceTest: MultipleChoice {
     public abstract bool CheckCorrectReal(params int[] answers);
     
     public override bool CheckCorrect(params int[] answers){
          return CheckCorrect(SelectedAnswer );
     }
}

和测试方法本身:

class TestQuestionForms{
    [Fact]
    public void TrueFalseTest_ShouldExecute_CheckCorrectReal()
    {
        //setup
        var mock = new Mock<TrueFalseTest>();

        mock.Setup(q => q.CheckCorrectReal(It.IsAny<int[] answers>))
            .Returns(true);

        //action
        mock.Object.IsCorrect();
       
       //assert
       mock.Verify(db => db.CheckCorrectReal());

    }
    [Fact]
    public void MultipleChoiceTest_ShouldExecute_CheckCorrectReal()
    {   
        //setup
        var mock = new Mock<MultipleChoiceTest>();

        mock.Setup(q => q.CheckCorrectReal(It.IsAny<int[] answers>))
            .Returns(true);

        //action
        mock.Object.IsCorrect();
       
       //assert
       mock.Verify(db => db.CheckCorrectReal());

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM