模拟基本接口属性不能通过模拟派生接口工作

模拟基本接口属性不能通过模拟派生接口工作

本文介绍了模拟基本接口属性不能通过模拟派生接口工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下接口:

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处理基本/派生的只读/读写属性,但那里没有考虑模拟对象的声明类型。这会是Moq的另一个问题吗?

推荐答案

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

这篇关于模拟基本接口属性不能通过模拟派生接口工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 02:33