【问题标题】:How to Mock a readonly property whose value depends on another property of the Mock如何模拟一个只读属性,其值取决于模拟的另一个属性
【发布时间】:2012-07-18 16:00:42
【问题描述】:

(如标签所示,我使用的是最小起订量)。

我有一个这样的界面:

interface ISource
{
  string Name { get; set; }
  int Id { get; set; }
}

interface IExample
{
  string Name { get; }
  ISource Source { get; set; }
}

在我的应用程序中,IExample 的具体实例接受 DTO (IDataTransferObject) 作为源。 IExample 的具体实现上的一些属性只是简单地委托给 Source。像这样……

class Example : IExample
{
  IDataTransferObject Source { get; set; }

  string Name { get { return _data.Name; } }
}

我想创建一个独立的 IExample 模拟(独立意味着我不能使用捕获的变量,因为在测试过程中将创建多个 IExample 模拟实例)并设置模拟以便 IExample.Name 返回IExample.Source.Name 的值。所以,我想创建一个类似这样的模拟:

var example = new Mock<IExample>();
example.SetupProperty(ex => ex.Source);
example.SetupGet(ex => ex.Name).Returns(what can I put here to return ex.Source.Name);

本质上,我想将模拟配置为返回模拟的子对象的属性值作为一个属性的值。

谢谢。

【问题讨论】:

    标签: c# .net moq


    【解决方案1】:

    你可能会使用:

    example.SetupGet(ex => ex.Name).Returns(() => example.Object.Source.Name);
    

    然后将在访问属性时确定要返回的值,并将取自 mock 的 Source 属性的 Name 属性。

    【讨论】:

    • 这正是我想要的。我从来没有想过要捕获作为我想要引用以获取其基础值的 Mock 的局部变量。它让我的大脑受伤。
    • 请注意,在这种情况下您不需要 lambda。只需使用 .Returns(example.Object.Source.Name),至少对于最新版本的 Moq。
    • @Pac0 - lambda 方法应该适用于所有情况,而传递属性的值只会在值不变且在设置模拟点时可用时给出正确的结果。如果属性可以在不同的时间点返回不同的值,那么 lambda 是唯一的选择。
    • 这绝对是支持使用 lambda 的一个很好的论据,你是对的。无论如何,最好理解这两个版本的行为方式不同,
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多