unit-testing - 模拟基接口属性不能通过派生接口的模拟工作
问题描述
我有这些接口:
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
标志才能访问基本接口属性(由派生接口隐藏)?还是有其他我可以使用的设置?
附带说明一下,处理基本/派生只读/读写属性时存在问题,但未考虑模拟对象的声明类型。这可能是起订量的另一个问题吗?
解决方案
接口和接口的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" );
推荐阅读
- java - 使用 PDFBOX 将顶级书签添加到现有 PDF
- php - 从字符串中顺序获取 2 个随机字母
- r - 使用 stat_smooth 的线性模型的散点图线
- c - 如何让我的 do while 循环在 C 中工作?
- mysql - -bash:mysql:找不到命令
- android - ionic backgroundFetch 配置未更新
- javascript - 网络音频中的多个实例
- azure-data-factory - 提高 Azure 数据工厂的并发性
- sql - 如何根据该字段中具有重复项的表创建一个字段中没有重复项的新表?
- java - 跳过或忽略 Jackson 的 YAML 解析错误