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)
你不需要模仿它就可以用它来测试.
您应该能够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)
| 归档时间: |
|
| 查看次数: |
1488 次 |
| 最近记录: |