簡體   English   中英

如何使用Moq來測試C#終結器中的兩個方法是否已在GC上調用?

[英]How can I use Moq to test that two methods inside a C# finalizer have been called on GC?

我正在嘗試編寫一個單元測試,以確保已調用終結器中的兩個方法。 我的問題是我無法斷言超出范圍的模擬。 讓我展示一下我的代碼問題:

internal class MyClass
{
    MyClass() { }

    ~MyClass()
    {
        this.MethodA()
        this.MethodB()
    }
}

[TestMethod]
public void Finalize_NormalDestruction_MethodAandMethodBCalled()
{
    var myMock = new myMock();

    GC.Collect();
    GC.WaitForPendingFinalizers();

    Assert.IsTrue(myMock.IsMethodACalled);  // Fails, myMock never went OOS
    Assert.IsTrue(myMock.IsMethodBCalled);  // Fails, myMock never went OOS
}

[TestMethod]
public void Finalize_NormalDestruction_MethodAandMethodBCalled()
{
    {
        var myMock = new myMock();
    }

    GC.Collect();
    GC.WaitForPendingFinalizers();

    Assert.IsTrue(myMock.IsMethodACalled);  // Doesn't compile, myMock is OOS
    Assert.IsTrue(myMock.IsMethodBCalled);  // Doesn't compile, myMock is OOS
}

有沒有一種方法可以使用Moq來測試終結器是否已運行? 我已經能夠使用斷點手動測試它,但是我想要一個自動化測試。

為了使終結器運行,您的代碼不能具有對該實例的任何實時引用。 如果您確實要在測試中進行驗證,則有兩種選擇。

您可以存儲以下事實:方法已作為類型的靜態成員運行。 但是,您必須做任何必要的准備工作,以確保自己可以在感興趣的實例上運行。

或者,您可以讓終結器恢復實例。 我不建議這樣做只是為了測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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