本文介绍了模拟基本接口属性不能通过模拟派生接口工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下接口:
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
标志才能访问基本接口属性(它被派生接口隐藏)?还是有其他类型的设置可以让我使用?
推荐答案
IBase
接口和IDerived
接口的Value
属性不同。例如,您可以这样做:
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" );
这篇关于模拟基本接口属性不能通过模拟派生接口工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!