2013-03-20 65 views
2

我正在寫使用AutoFixture我的抽象類單元測試,這是我想要做的表示:起訂量斷言的抽象方法被稱爲

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

您使用AutoFixture爲[自動嘲諷集裝箱( http://blog.ploeh.dk/2013/03/11/auto-mocking-container/),但這實在是一個關於Moq的問題。 – 2013-03-20 20:33:07

回答

5

有一堆可以瞭解這個說:

  1. 好像你可能會要麼測試太多,或給予太多的控制,其他實現。

    • (過多的控制)通常情況下,如果要強制的方法從另一種方法在你abstract class你不把它叫做public virtual。通過這樣做,您已經賦予未來實現更改此行爲的能力。事實上,如果你刪除了virtual,那麼你可以得到你想要的測試(見下文)。我確實提供了一種方法來保持virtual,但再次...不推薦。這是不推薦的,因爲你的SUT是你的模擬......這不正確。
    • (測試太多)您應該只關心基本行爲,而不是實現細節,以免測試過於脆弱。我假設不僅僅是對OnDoingSomethingCool方法的調用,否則你應該把它作爲你的主要方法。如果主要行爲是這個呼叫(並且不僅僅是這個呼叫),那麼我在下面的NotRecommended方法中涵蓋了這一點。
  2. 您不應該直接測試抽象類。您應該使用Roy Osherove在The Art of Unit Testing中稱爲抽象測試類模式。這使得所有的實現都可以測試你的行爲。然後您可以傳入依賴關係。如果您想那個例子,甚至一個簡單的例子關閉抽象測試類模式,讓我知道

/

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()); 
}