我在模拟一组接口(interface)时遇到问题:
interface IFoo
{
object Blah { get; }
}
interface IBar : IFoo
{
new string Blah { get; }
}
我试着 mock 为:
var mock = new Mock<IFoo>();
mock.SetupGet(m => m.Blah).Returns("Blah");
这现在有效:
Assert.That(mock.Object.Blah, Is.EqualTo("Blah"));
问题是,当我添加以下内容时,IBar
接口(interface)也有一个值,IFoo.Blah
的值为 null。
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
有没有办法让两者都起作用?
最佳答案
对于最小起订量 (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"));
您必须在设置您的属性之前初始化您的界面。
关于c# - 使用 Moq 模拟具有 'new' 成员的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5170186/