簡體   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