首页 > 解决方案 > 模拟基接口属性不能通过派生接口的模拟工作

问题描述

我有这些接口:

public interface IBase
{
    int Value { get; }
}

public interface IDerived : IBase
{
    new int Value { get; set; }
}

以下测试正常工作:

var mock = new Mock<IDerived>( MockBehavior.Strict );
mock.SetupGet( m => m.Value ).Returns( 0 );

IDerived o = mock.Object;

Assert.That( o.Value, Is.EqualTo( 0 ) );

但是,当我将类型更改为 时oIBase出现以下错误:

Message: Moq.MockException : IBase.Value invocation failed with mock behavior Strict.
All invocations on the mock must have a corresponding setup.

这是设计使然吗?我是否需要删除Strict标志才能访问基本接口属性(由派生接口隐藏)?还是有其他我可以使用的设置?

附带说明一下,处理基本/派生只读/读写属性时存在问题,但未考虑模拟对象的声明类型。这可能是起订量的另一个问题吗?

标签: unit-testingmoq

解决方案


接口和接口的Value属性是不一样的。例如,您可以这样做:IBaseIDerived

public interface IBase
{
    string Value { get; }
}

public interface IDerived : IBase
{
    new string Value { get; }
}

public class Implementation : IDerived
{
    string IBase.Value { get; } = "Base";

    string IDerived.Value { get; } = "Derived";
}

要正确模拟IDerived接口,您应该为这两个属性设置返回值。Mock.As方法在这里将IDerived接口转换为IBase.

Mock<IDerived> mock = new Mock<IDerived>( MockBehavior.Strict );
mock.Setup( obj => obj.Value ).Returns( "Derived" );
mock.As<IBase>().Setup( obj => obj.Value ).Returns( "Base" );

推荐阅读