我有一个对象,它具有与事件订阅相关的内部逻辑。 我想编写一个自动测试,检查对象是否可以在某些步骤后被 GC 收集。 例如:
public interface IEventPublisher {
event Action Evt;
}
public class MyClass : IDisposable {
private IEventPubliser _evtPub;
public MyClass(IEventPublisher evtPub) {
_evtPub = evtPub;
}
public void Initialize() {
_evtPub.Evt += EvtHandler();
}
private void EvtHandler() {
// *some logic*
}
public void Dispose() {
_evtPub.Evt -= EvtHandler();
}
}
[Test]
public void MemoryLeakTest() {
{
// Arrange
var evtPub = // *mock event publisher with NSubstitute or something*
var myObj = new MyClass(evtPub);
// Act
myObj.Initialize();
// *do some staff maybe*
myObj.Dispose();
}
// Assert
// ASSERT_NO_REFERENCES_TO_myObj
}
所以,主要问题是我应该用什么来代替
ASSERT_NO_REFERENCES_TO_myObj
?这至少是可能的吗?
我在这个answer中编写了一个测试,可以满足您的需求。
它利用了
WeakReference
基本上可以归结为:
var a = new A();
var wr = new WeakReference(a);
a = null;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Console.WriteLine(wr.IsAlive); // True -> this is the Assert if not GC.ed..Flase if GCed