[英]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
{
}
像這樣我可以設置屬性並測試主要方法
沒有簡單的方法可以測試它,
最好的選擇是:
所以例如你有下一個繼承結構
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.