【问题标题】:How simple entity class (POCO) can be mocked with Moq?Moq 可以模拟多简单的实体类(POCO)?
【发布时间】:2016-01-06 16:57:53
【问题描述】:

我需要像这样测试简单的类:

public class SomeEntity {
  public int Id { get; set; }
  public string Name { get; set; }
}

我想用这个类对象的模拟来编写测试,如下所示:

var someMock = new Moq.Mock<SomeEntity>();

someMock.SetupGet(x => x.Id).Returns(12345678);
someMock.SetupGet(x => x.Name).Returns(It.IsIn(someList));

如您所知,Moq 框架需要接口或虚拟方法来创建代理对象。所以我的问题是:我怎样才能模拟我的实体类而不实现接口或用虚拟标记属性?

更新:所有这一切中最想要的结果是用多种可能的属性组合将 moq 对象替换为我的单元测试。

更新 2:看起来我不需要模拟我的实体类,我只需要使用 It.IsIn(someList) 遍历所有可能的组合:

var someEntity = new SomeEntity {
  Id = 12345678,
  Name = It.IsIn(someList)
}

【问题讨论】:

  • 模拟行为,而不是属性...
  • 请看我的更新
  • 您想使用不同名称的 SomeEntity 实例运行相同的测试?即 someList? 中的所有名称
  • 同意这里的其他人,没有理由模拟一个无行为的对象——在这里,似乎是一个 DTO。您需要更好地了解何时/如何使用对象模拟,或者您的代码示例还不够。
  • @DenisEfimov 你想通过在这里使用模拟来获得什么好处?没有逻辑的实体不需要特别模拟

标签: c# unit-testing moq


【解决方案1】:

您无需模拟它即可对其进行测试。

您应该能够直接在当前状态下使用SomeEntity 进行测试(并自行测试,但测试自动属性似乎是浪费精力)。

如果你创建一个ISomeEntity 实现的ISomeEntity 接口,那么你就可以在任何消耗它的东西中模拟它。然后,您将能够测试 ISomeEntity 传入的方法的行为。

正如你所说,Moq 要求它是一个接口或虚拟方法才能工作。

public class SomeEntity : ISomeEntity {
  public int Id { get; set; }
  public string Name { get; set; }
}

public interface ISomeEntity {
  int Id { get; set; }
  string Name { get; set; }
}

然后

var someMock = new Mock<ISomeEntity>();

someMock.SetupGet(x => x.Id).Returns(12345678);
someMock.SetupGet(x => x.Name).Returns(It.IsIn(someList));

var result = somethingelse.Act(someMock.Obect);

如果您的对象与示例中一样无逻辑,则无需转到 Mock

var item = new SomeEntity();

item .Id = 12345678;
item .Name = "some name";

var result = somethingelse.Act(item);

您想通过在这里使用模拟来获得什么好处?如果您尝试遍历列表并验证其中的每个项目,It.IsIn 不会这样做(即使附加到模拟),它只会检查分配给模拟的值是否在允许的列表中价值观。

这打破了每个测试格言的单一断言,但是,我认为这是你想要的:

var item = new SomeEntity();

foreach (var name in someList)
{
  item .Id = 12345678;
  item .Name = name ;

  var result = somethingelse.Act(item);
  // Assert
}

【讨论】:

  • 我不需要测试它,我需要最小起订量来测试其他类。正如我在问题中强调的那样,我正在寻找没有界面的方式
  • @DenisEfimov 如果您在问题中添加为什么不能使用界面可能会有所帮助?
  • 因为 POCO 对象很多,我不想用很多接口阻塞项目。
  • 最好在编辑之前——直到给出理由,最好以“你不需要在这里嘲笑”来引导。
  • 我刚刚阅读了我的问题的描述。抱歉,我需要提出新问题,并将您的答案标记为正确。感谢您的宝贵时间
猜你喜欢
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多