c# - 使用 Moq 模拟具有 'new' 成员的接口(interface)

标签 c# moq

我在模拟一组接口(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/

相关文章:

c# - 如何从 Access .mdb 文件创建 .edmx 模型?

c# - 相同的 Excel 公式在 Visual Studio C# 中返回不同的结果

c# - 是否可以使用 Moq 设置没有 setter 的属性?

unit-testing - 使用多个构造函数参数模拟和测试类

c# - Windows Process Activation Service 未启动错误 3

c# - 如何在 C# 中使用鼠标绘制和移动形状

c# - 如何更快地处理 C# 中的 MouseMove 事件

c# - 使用 Moq 实例引发 EventHandler<TEventArgs> 事件

coding-style - FakeItEasy 回调实现

unit-testing - 如何使用Moq来模拟StackExchange.Redis库抛出的异常?