gpt4 book ai didi

c# - 模拟和 Marshal.ReleaseComObject()

转载 作者:太空狗 更新时间:2023-10-30 01:04:47 30 4
gpt4 key购买 nike

我在设置模拟时遇到问题,所以我可以在我的模拟对象上调用 Marshal.ReleaseComObject()

我正在使用 Moq 设置 IFeature 类型的模拟(来自第三方接口(interface)库)。模拟设置非常简单:

  var featureMock = new Mock<IFeature>(); 
IFeature feature = featureMock.Object;

在我的代码中,特征对象是在 while 循环中创建的,通过一种游标 (FeatureCursor) 运行。由于第三方库的遗留问题,Feature 对象存在已知的内存泄漏问题。因此,我必须通过 Marshal.ReleaseComObject() 释放对象,如代码所示;

public class XXX
{

public void DoThis()
{
IFeatureCursor featureCursor;
//...fill the cursor with features;

IFeature feature = null;
while ((feature = featureCursor.NextFeature)!= null)
{
//Do my stuff with the feature
Marshal.ReleaseComObject(feature);
}

}

}

当我使用真实的特征光标和特征时它有效,但是当我在单元测试中模拟该特征时,我得到一个错误:

"System.ArgumentException : The object's type must be __ComObject or derived from __ComObject."

但是我如何将它应用到我的 Mock 对象上呢?

最佳答案

模拟的 IFeature 将只是一个标准的 .NET 类,而不是 COM 对象,这就是为什么您的测试当前抛出 对象的类型必须是__ComObject... 异常。

您只需要包装对 Marshal.ReleaseComObject(feature); 的调用并首先检查该对象是否为 COM 对象:

if (Marshal.IsComObject(feature)
{
Marshal.ReleaseComObject(feature);
}

然后您的测试将通过但不会调用 Marshal.ReleaseComObject(生产代码将调用它)。

由于听起来您确实想以某种方式验证代码调用了 Marshal.ReleaseComObject,因此您需要做更多的工作。

因为它是一个静态方法并且实际上不会对对象本身做任何事情,所以您唯一的选择就是创建一个包装器:

public interface IMarshal
{
void ReleaseComObject(object obj);
}

public class MarshalWrapper : IMarshal
{
public void ReleaseComObject(object obj)
{
if (Marshal.IsComObject(obj))
{
Marshal.ReleaseComObject(obj);
}
}
}

然后让您的代码依赖于IMarshal,您也可以在测试和验证中模拟它:

public void FeaturesAreReleasedCorrectly()
{
var mockFeature = new Mock<IFeature>();
var mockMarshal = new Mock<IMarshal>();

// code which calls IFeature and IMarshal
var thing = new Thing(mockFeature.Object, mockMarshal.Object);
thing.DoThis();

// Verify that the correct number of features were released
mockMarshal.Verify(x => x.ReleaseComObject(It.IsAny<IFeature>()), Times.Exactly(5));
}

关于c# - 模拟和 Marshal.ReleaseComObject(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21727520/

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