1

我正在尝试使用 Moq 实现一个单元测试,该测试需要能够模拟来自 COM 库的接口。具体来说,当调用将 Point 类型作为参数的方法时,我需要 Moq 认识到 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 并没有区别。有什么方法可以让 Moqnew Point()在 Setup 方法中识别 a 吗?我什至可以用一种方式告诉 Moq,“嘿,我不在乎传递的参数是什么。总是返回指定的返回值,不管是什么。永远不要返回 null。” 但它开始看起来像我在这里不走运。

4

0 回答 0