簡體   English   中英

Moq斷言一個抽象方法稱為

[英]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設置一個模擬並斷言該方法已被調用,但是由於該方法是被測對象內部的抽象方法,因此如何斷言該方法被稱為?

關於這一點可以說一堆:

  1. 看起來您可能要么測試過多,要么對其他實現給予過多控制。

    • (太多的控制)通常,如果要強制從abstract class另一個方法調用一個方法,則不要將其設為public virtual 這樣,您就為將來的實現提供了更改此行為的能力。 實際上,如果您刪除了virtual ,那么您可以得到想要的測試(請參見下文)。 我確實提供了一種保留virtual ,但是再次...不推薦。 不建議這樣做,因為您的SUT是您的模擬游戲……感覺不對。
    • (測試太多)您應該只關心基本行為,而不是實現細節,以免測試變得過於脆弱。 我假設不僅有對OnDoingSomethingCool方法的調用,否則您應該使它成為主要方法。 如果主要行為是此調用(並且不止是此調用),那么我將在下面的NotRecommended方法中進行介紹。
  2. 您不應該直接測試抽象類。 您可能應該使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM