如何通过自动测试检查对象是否导致内存泄漏?

问题描述 投票:0回答:1

我有一个对象,它具有与事件订阅相关的内部逻辑。 我想编写一个自动测试,检查对象是否可以在某些步骤后被 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
?这至少是可能的吗?

c# automated-tests garbage-collection observer-pattern
1个回答
0
投票

我在这个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
© www.soinside.com 2019 - 2024. All rights reserved.