模拟接口使用MOQ 4.0重新定义属性

Car*_*ngo 1 unit-testing moq

在较旧版本的MOQ中,以下代码可以正常工作(例如3.1.416.3).它不再了.如何将模拟更改为工作?问题是接口继承了另一个接口并重新定义了一个字段.因此我的模拟现在需要配置两个字段的值,因为这在我Code1()Code2()调用中使用

public interface I
{
    string field { get; }
}

public interface IModi : I
{
    new string field { get; set; }
}

public class P : IModi
{
    private string val;

    string I.field
    {
        get { return val; }
    }

    public string field
    {
        get { return val; }
        set { val = value; }
    }

    public static void Code1(I p)
    {
        Console.WriteLine(p.field);
    }

    public static void Code2(IModi p)
    {
        Code1(p);
        Console.WriteLine(p.field);
    }
}
Run Code Online (Sandbox Code Playgroud)

失败的测试

[TestFixture]
class MoqTests
{
    [Test]
    public void testinterfaces()
    {
        MockRepository factory = new MockRepository(MockBehavior.Strict);
        var mock = factory.Create<IModi>();
        mock.Setup(x => x.field).Returns("hello");
        P.code2(mock.Object);
    }
}
Run Code Online (Sandbox Code Playgroud)

错误

Moq.MockException:I.field调用失败,模拟行为严格.模拟上的所有调用都必须具有相应的设置.

Igo*_*aka 5

这是可能的使用Mock<T>.As<T>()方法.As()为模拟添加一个接口,从而允许您为不同的接口指定不同的设置.

隐藏方法/属性的警告语(如果你问我,我通常会避免使用它们,这是非常邪恶的).你必须设置隐藏的方法首先,建立最外面的方法之前,否则最里面的设置将触发两个调用.这看起来像是一个Moq的bug.

这应该工作:

[Test]
public void testinterfaces()
{
    MockRepository factory = new MockRepository(MockBehavior.Strict);
    var mock = factory.Create<IModi>();
    mock.As<I>.Setup(x => x.field).Returns("hello");
    mock.Setup(x => x.field).Returns("hello");
    P.code2(mock.Object);
}
Run Code Online (Sandbox Code Playgroud)