[英]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.