模拟基本接口属性无法通过派生接口的模拟工作

时间:2019-05-28 08:40:19

标签: unit-testing moq

我有以下接口:

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 ) );

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

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

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

作为旁注,有一个issue处理基础/派生的只读/读写属性,但此处未考虑模拟对象的声明类型。最小起订量可能是另一个问题吗?

1 个答案:

答案 0 :(得分:2)

Value接口和IBase接口的IDerived属性是不相同的。例如,您可以执行以下操作:

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" );