【问题标题】:Mocking interface re-defining a property using MOQ 4.0使用 MOQ 4.0 重新定义属性的模拟接口
【发布时间】:2011-09-03 07:46:12
【问题描述】:

在较旧版本的 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。 模拟上的所有调用都必须有相应的设置。

【问题讨论】:

    标签: unit-testing moq


    【解决方案1】:

    这可以使用Mock&lt;T&gt;.As&lt;T&gt;() 方法实现。 As() 为模拟添加了一个接口,从而允许您为不同的接口指定不同的设置。

    隐藏方法/属性的警告词(如果你问我,这是非常邪恶的,我通常避免使用它们)。您必须首先设置隐藏方法,然后再设置最外层的方法,否则最内层的设置将在两个调用中触发。对我来说,这看起来像是一个起订量错误。

    这应该可行:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 2012-08-21
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      相关资源
      最近更新 更多