在Moq中模拟COM对象时,“调用失败,模拟行为严格”异常

时间:2016-08-26 16:54:35

标签: c# unit-testing com moq esri-arc-engine

我正在尝试使用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。”但现在开始看起来我运气不好。

0 个答案:

没有答案