c# - Moq 可以模拟多简单的实体类 (POCO)?

标签 c# unit-testing moq

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

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 框架需要接口(interface)或虚拟方法来创建代理对象。所以我的问题是:如何在实现接口(interface)或用虚拟标记属性的情况下模拟我的实体类?

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

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

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

最佳答案

你不需要模拟它来测试它。

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

如果您创建一个 ISomeEntity 的接口(interface),该接口(interface)由 SomeEntity 实现,那么您就可以在任何使用它的东西中模拟它。然后,您将能够测试将 ISomeEntity 传入的方法的行为。

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

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 不会这样做(即使附加到模拟)它只会检查分配给模拟的值是否在允许列表中值(value)观。

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

var item = new SomeEntity();

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

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

关于c# - Moq 可以模拟多简单的实体类 (POCO)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34638516/

相关文章:

c# - WPF 嵌套数据绑定(bind)到控件 - 为什么它不起作用

c# - 比较可为空的日期时间

c# - .NET 中 CIL 知识的优势

c++ - 让 visual studio 2012 自动复制引用项目的引用 (C++)

unit-testing - 使用最小起订量的奇怪行为

c# - 如何对调用 Action 的 HTML Helper 进行单元测试?

c# - 正则表达式:以特定字符开头,后跟任何字符的模式中的任何字符串

c++ - 在 Google Test 中打印 exception.what()

c# - 模拟 DirectoryEntry 的 "Properties"属性

c# - 最小起订量,调用具有构造函数依赖性的基础