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

时间:2016-01-06 16:57:54

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

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

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

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

1 个答案:

答案 0 :(得分: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; }
}

然后

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
}