C# 如何使用Moq模拟简单实体类(POCO)?

C# 如何使用Moq模拟简单实体类(POCO)?,c#,unit-testing,moq,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(

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

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));
我想使用此类对象的mock编写测试,如下所示:

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));

你不需要模仿它就能用它进行测试

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

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

正如您所说,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; }
}
然后

你想通过在这里使用模拟来获得什么好处?如果您试图遍历列表并验证其中的每个项目,则it.IsIn不会执行此操作(即使附加到模拟),它将检查分配给模拟的值是否在允许值列表中

这打破了每个测试准则的单一断言,但我认为这正是您想要的:

var item = new SomeEntity();

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

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

模拟行为,而不是属性…请查看我的更新您想对具有不同名称的某个实体的不同实例运行相同的测试吗?例如,someList中的所有名称?同意这里的其他名称,没有理由模仿行为无关的对象——这里,似乎是DTO。要么您需要更好地理解何时/如何使用对象模拟,要么您的代码示例不够。@DenisEfimov在这里使用模拟有什么好处?一个无逻辑的实体并不特别需要mocking,我不需要测试它,我需要moq它来测试其他类。正如我在问题中强调的那样,我正在寻找一条没有障碍的道路interface@DenisEfimov如果您在问题中添加为什么不能使用接口,这可能会有所帮助?因为有许多POCO对象,我不想用许多接口阻塞项目。最好在编辑之前--在给出原因之前,最好以“您不需要在此处进行模拟”开头1.我刚看过我的问题说明。对不起,我需要问一个新问题,并将你的答案标记为正确。谢谢你抽出时间
var item = new SomeEntity();

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

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