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# - UWP 中是否有替代 TemplatePartAttribute 的方法?

c# - 在抛出 AssertFailedException 的单元测试中比较两个数组

entity-framework-5 - 模拟 DbEntityEntry

c# - 如何显示带有项目的列表框,例如 item.name 显示在列表中,而传递的值是 item.id?

c# - Winform自动省略号宽度

c# - 使用 Moq 和 TDD,从哪里开始?

angular - ng2-translate:无法读取 TranslatePipe.transform 处未定义的属性 'subscribe'

c++ - mbed OS 5 项目中链接了哪些文件?

c# - 在 .Net Core 中测试 Controller 总是返回 false?

c# - 最小起订量在第二次验证时未执行任何调用