[英]Moq Assert an abstract method is called
我正在使用AutoFixture為我的Abstract類編寫一個單元測試,這是我正在嘗試做的一種表示:
public abstract class Base
{
public virtual void DoSomethingCool()
{
OnDoingSomethingCool();
}
protected abstract void OnDoingSomethingCool();
}
我的單元測試如下所示:
[TestMethod]
public void TestMethod1()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var sut = fixture.Create<Base>();
// How to assert that the OnDoingSomethingCool method was called
sut.Invoking(x => x.DoSomethingCool())
.ShouldNotThrow();
}
那么我如何斷言受保護的抽象方法實際上是在DoSomethingCool
方法中調用的?
如果它是來自注入的依賴關系的對象,我將能夠使用Moq
設置一個模擬並斷言該方法已被調用,但是由於該方法是被測對象內部的抽象方法,因此如何斷言該方法被稱為?
關於這一點可以說一堆:
看起來您可能要么測試過多,要么對其他實現給予過多控制。
abstract class
另一個方法調用一個方法,則不要將其設為public virtual
。 這樣,您就為將來的實現提供了更改此行為的能力。 實際上,如果您刪除了virtual
,那么您可以得到想要的測試(請參見下文)。 我確實提供了一種保留virtual
,但是再次...不推薦。 不建議這樣做,因為您的SUT是您的模擬游戲……感覺不對。 OnDoingSomethingCool
方法的調用,否則您應該使它成為主要方法。 如果主要行為是此調用(並且不止是此調用),那么我將在下面的NotRecommended
方法中進行介紹。 您不應該直接測試抽象類。 您可能應該使用Roy Osherove所謂的“單元測試的藝術”中的抽象測試類模式 。 這樣一來,所有實現都可以測試您的行為。 然后,您可以傳遞依賴項。 如果您想要該示例,甚至是Abstract Test Class Pattern的簡化示例,請告訴我
/
using Moq.Protected;
...
public void NotRecommended_ProbablyTestingTooMuch_BrittleTestBelow
{
//If you MUST keep DoSomethingCool virtual
//var baseMock = new Mock<Base>{CallBase = true};
var baseMock = new Mock<Base>();
baseMock.Protected().Setup("OnDoingSomethingCool");
baseMock.Object.DoSomethingCool();
baseMock.Protected().Verify("OnDoingSomethingCool", Times.AtLeastOnce());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.