我在模拟一组接口时遇到问题:
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
有没有办法让两者兼顾?
答案 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