我需要测试这样的简单类:
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)
}
答案 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
}