我需要像这样测试简单的类:
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/