如何用Moq模拟简单的实体类(POCO)?

Dzi*_*mau 3 c# unit-testing moq

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

public class SomeEntity {
  public int Id { get; set; }
  public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想用这样的类对象的mock来编写测试,如下所示:

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

someMock.SetupGet(x => x.Id).Returns(12345678);
someMock.SetupGet(x => x.Name).Returns(It.IsIn(someList));
Run Code Online (Sandbox Code Playgroud)

如您所知,Moq框架需要接口或虚拟方法来创建代理对象.所以我的问题是:如何在使用虚拟实现接口或标记属性的情况下模拟我的实体类?

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

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

var someEntity = new SomeEntity {
  Id = 12345678,
  Name = It.IsIn(someList)
}
Run Code Online (Sandbox Code Playgroud)

Nik*_*nte 5

你不需要模仿它就可以用它来测试.

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

如果你创建了一个实现的接口ISomeEntity,SomeEntity那么你就可以在任何消耗它的东西里面进行模拟.然后,您将能够测试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; }
}
Run Code Online (Sandbox Code Playgroud)

然后

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);
Run Code Online (Sandbox Code Playgroud)

如果你的对象像示例中那样没有逻辑,那么就没有必要去模拟

var item = new SomeEntity();

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

var result = somethingelse.Act(item);
Run Code Online (Sandbox Code Playgroud)

你试图通过这里使用模拟获得什么好处?如果你试图遍历列表并验证其中的每个项目,It.IsIn将不会这样做(甚至附加到模拟)它将检查所有它将分配给模拟的值是否在允许的列表中值.

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

var item = new SomeEntity();

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

  var result = somethingelse.Act(item);
  // Assert
}
Run Code Online (Sandbox Code Playgroud)