代码之家  ›  专栏  ›  技术社区  ›  John Nicholas

如何模拟一个需要转换到另一个接口的接口?

  •  62
  • John Nicholas  · 技术社区  · 14 年前

    我想做的是为I1构造一个moq-这很好。。。但是,在我测试的使用这个mock的方法的过程中,我需要将它转换为I2,以便访问一些不在I1上的属性

    Interface I1 
    { int AProperty{get;set;}}
    
    Interface I2
    {int AnotherProperty{get;set;}}
    

    我有一些东西

    Class O1 : I1 {}
    

    Class O2 : O1 , I2 {}
    

    唯一的问题是在该类上编写单元测试时。

    接口还公开了一个名为GetNewInstance的方法,该方法返回转换到IGetNewInstance接口的实现对象的初始化实例。。。我通常可以模拟这个fine并使它自身返回(因此我继续使用mock对象)。

    但是,当您尝试将此类型为I2的返回对象强制转换为I1时,会产生一个空引用结果-这是有意义的,因为实现I2的模拟对象不会从继承I1的任何对象继承。

    问题是如何强制mock对象同时从I1和I2继承?

    1 回复  |  直到 14 年前
        1
  •  134
  •   Bart Verkoeijen    8 年前

    按照我的理解,您希望创建一个实现两个接口的mock。对于最小起订量,就这么简单:

    var mock = new Mock<IFoo>(); // Creates a mock from IFoo
    mock.As<IBar>(); // Adds IBar to the mock
    mock.As<IBar>().Setup(m => m.BarMethod()).Returns(new object()); // For setups.
    

    现在,您可以设置期望并使用mock,就像您通常使用实现这两者的对象一样 IFoo IBar .

    GetNewInstance