如何模拟一个readonly属性,其值取决于模拟的另一个属性

时间:2012-07-18 16:00:42

标签: c# .net moq

(如标签所示,我使用的是moq)。

我有这样的界面:

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

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

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

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

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

我想创建一个IExample的独立模拟(独立意味着我不能使用捕获的变量,因为IExample mock的几个实例将在测试过程中创建)并设置Mock以便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);

基本上,我想配置mock以返回一个属性的值,即mock的子对象的属性值。

感谢。

1 个答案:

答案 0 :(得分:39)

您可以使用:

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

将在访问属性时确定要返回的值,并将从模拟的Name属性的Source属性中获取。