我正在尝试使用Moq实现单元测试,该测试需要能够模拟来自COM库的接口。具体来说,我需要Moq识别Point类型的对象实际上是一个Point,它调用一个Point类型作为参数的方法。此Point类型来自ESRI ArcGIS库。但是,即使在做一个看似非常简单的测试时,我也会得到调用失败的异常,因为调用与设置不匹配。这是我能做的最简单的案例:
public interface ITest
{
int TestMethod(Point p);
}
public class TestClass : ITest
{
public int TestMethod(Point p)
{
return 0;
}
}
[TestMethod]
public void MyTest()
{
Mock<ITest> mockTest = new Mock<ITest>(MockBehavior.Strict);
mockTest.Setup(x => x.TestMethod(It.IsAny<Point>())).Returns(0);
mockTest.Object.TestMethod(new Point());
}
当我调用TestMethod时,我得到了异常。如果我在运行期间查看Point的类型,则类型为System .__ ComObject,由于保护级别,我无法直接创建。当我查看Point的元数据时, 这就是我所看到的:
using System.Runtime.InteropServices;
namespace ESRI.ArcGIS.Geometry
{
[CoClass(typeof(PointClass))]
public interface Point : IPoint
{
}
}
我也试过嘲笑IPoint,但没有区别。有没有办法让Moq识别Setup方法中的new Point()
?我甚至可以告诉Moq,“嘿,我不关心任何传递的参数是什么。总是返回指定的返回NO MATTER WHAT。永远不会返回null。”但现在开始看起来我运气不好。