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

时间:2011-05-27 10:56:42

标签: 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);
    }
}

失败的测试

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

错误

  

Moq.MockException:I.field调用因模拟行为Strict而失败。   模拟上的所有调用都必须有相应的设置。

1 个答案:

答案 0 :(得分: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);
}