2011-03-02 82 views
2

我有问题嘲讽的一套接口:有嘲讽接口的“新”成员起订量

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 

有没有办法让这两个工作?

回答

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

必须初始化设置你的财产在你的界面。

+0

似乎将'mock.As '调高 – 2011-03-02 17:15:44

0

我认为你需要使用“覆盖”而不是“新”。当你使用“新”时,你实际上正在制作第二个功能。这里的DOC:http://msdn.microsoft.com/en-us/library/ms173153.aspx

+0

除非附加功能的目的是,在这种情况下,你需要找到一种方式,当您使用伊巴尔嘲笑两种功能。 – 2011-03-02 16:22:19

+0

我不能使用替代,因为其中的一个接口,'IFoo'在这种情况下,是不是我的。我需要嘲笑这两个函数,但嘲笑第二个函数会清除第一个函数的模拟。 – 2011-03-02 16:23:37