模拟具有Moq“新”成员的接口

时间:2011-03-02 16:08:41

标签: c# moq

我在模拟一组接口时遇到问题:

interface IFoo
{
    object Blah { get; }
}

interface IBar : IFoo
{
    new string Blah { get; }
}

我试着嘲笑:

var mock = new Mock<IFoo>();
mock.SetupGet(m => m.Blah).Returns("Blah");

现在可以使用:

Assert.That(mock.Object.Blah, Is.EqualTo("Blah"));

问题在于,当我添加以下内容时,为了IBar接口的值,IFoo.Blah的值为空。

var bar = mock.As<IBar>();
bar.SetupGet(m => m.Blah).Returns("Blah");

现在可以使用:

Assert.That(((IBar)mock.Object).Blah, Is.EqualTo("Blah"));

但旧的失败了:

Assert.That(mock.Object.Blah, Is.EqualTo("Blah"));
// mock.Object.Blah is null now

有没有办法让两者兼顾?

2 个答案:

答案 0 :(得分:1)

使用MOQ(v4.0.10827)和.Net 4,此代码正常运行:

var mock = new Mock<IFoo>();
var bar = mock.As<IBar>();
mock.SetupGet(m => m.Blah).Returns("Blah");
Assert.That(mock.Object.Blah, Is.EqualTo("Blah"));
bar.SetupGet(m => m.Blah).Returns("BlahBlah");
Assert.That(((IBar)mock.Object).Blah, Is.EqualTo("BlahBlah"));
Assert.That(mock.Object.Blah, Is.EqualTo("Blah"));

您必须在设置属性之前初始化界面。

答案 1 :(得分:0)

我认为您需要使用“覆盖”而不是“新”。当你使用“new”时,你实际上是在做第二个功能。这是文档:http://msdn.microsoft.com/en-us/library/ms173153.aspx