gpt4 book ai didi

c# - 如何使用反射对 Dispose() 进行单元测试?

转载 作者:行者123 更新时间:2023-11-30 13:21:50 24 4
gpt4 key购买 nike

我想为实现 IDisposable 的类编写单元测试。该类有许多私有(private)字段也实现了 IDisposable。在我的测试中,我想验证当我调用 Dispose() 时,它会在其所有 IDisposable 字段上正确调用 Dispose()。本质上,我希望我的单元测试看起来像这样:

var o = new ObjectUnderTest();
o.Dispose();
Assert.IsFalse(ObjectHasUndisposedDisposables(o));

我正在考虑使用反射来实现这一点。这似乎是一个相当普遍的要求,但我找不到任何例子。

有人试过吗?

编辑——我不想将 Disposables 注入(inject)被测类。

最佳答案

在不对代码进行任何重构的情况下验证您正在寻找的行为的唯一方法是使用代码编织工具,例如; Typemock Isolator、MsFakes 等...

以下代码片段显示了使用 MsFakes 验证行为的方法:

[TestMethod]
public void TestMethod1()
{
var wasCalled = false;
using (ShimsContext.Create())
{
ForMsFakes.Fakes.ShimDependency.AllInstances.Dispose = dependency =>
{
wasCalled = true;
};

var o = new ObjectUnderTest();

o.Dispose();
}

Assert.IsTrue(wasCalled);
}

public class Dependency : IDisposable
{
public void Dispose() {}
}

public class ObjectUnderTest: IDisposable
{
private readonly Dependency _d = new Dependency();

public void Dispose()
{
_d.Dispose();
}
}

关于c# - 如何使用反射对 Dispose() 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37260547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com