use*_*948 25 c# testing unit-testing moq mocking
我目前对如何嘲笑感到困惑.
我正在使用Moq.为了模拟对象,我通常以这种方式编写
var mockIRepo = new Mock<IRepo>();
Run Code Online (Sandbox Code Playgroud)
但是,我需要为我的设置创建模拟对象.
Option1 以这种方式模拟仅包含属性的对象是否更好?
var object = Mock.Of<Object>()
Run Code Online (Sandbox Code Playgroud)
Option2 或者这样
var object = new Mock<Object>()
Run Code Online (Sandbox Code Playgroud)
我已经读过选项2有setupproperties这对我来说有点问题,因为我也可以在选项1中设置属性.
那有什么区别?或者,还有更好的方法?
Rig*_*iga 34
这篇文章帮助我了解Mock.Of <T>: 旧式命令Mock <T> vs功能性Mock.Of <T>
正如帖子中所解释的那样,使用Mock.Of <T>你会说"给我一个行为类似的模拟"(或者Mock s.如果需要获得许多对象(IEnumerable),则为<T>).它使模拟的声明更简洁.
Mock <T>示例(返回模拟)
var el1 = new Mock<IElementInfo>();
el1.Setup(x => x.Id).Returns(Guid.NewGuid());
el1.Setup(x => x.Multiplicity).Returns(Multiplicity.Single);
var c1 = new Mock<ICollectionInfo>();
c1.Setup(x => x.Id).Returns(Guid.NewGuid());
c1.Setup(x => x.Multiplicity).Returns(Multiplicity.Multiple);
var p1 = new Mock<IPropertyInfo>();
p1.Setup(x => x.Id).Returns(Guid.NewGuid());
p1.Setup(x => x.Name).Returns("Foo" + Guid.NewGuid().ToString());
p1.Setup(x => x.Type).Returns("System.String");
var p2 = new Mock<IPropertyInfo>();
p2.Setup(x => x.Id).Returns(Guid.NewGuid());
p2.Setup(x => x.Name).Returns("Bar" + Guid.NewGuid().ToString());
p2.Setup(x => x.Type).Returns("System.String");
var elementInfoMock = new Mock<IElementInfo>();
elementInfoMock.Setup(e => e.Id).Returns(Guid.NewGuid());
elementInfoMock.Setup(e => e.Multiplicity).Returns(Multiplicity.Multiple);
elementInfoMock.Setup(e => e.Elements)
.Returns(new List<IAbstractElementInfo>
{
el1.Object,
c1.Object,
});
elementInfoMock.Setup(x => x.Properties).Returns(
new List<IPropertyInfo>
{
p1.Object,
p2.Object,
});
this.elementInfo = elementInfoMock.Object;
Run Code Online (Sandbox Code Playgroud)
使用Mock.Of <T>的相同示例(返回类的实例)
this.elementInfo = Mock.Of<IElementInfo>(x =>
x.Id == Guid.NewGuid() &&
x.Multiplicity == Multiplicity.Multiple &&
x.Elements == new List<IAbstractElementInfo>
{
Mock.Of<IElementInfo>(e => e.Id == Guid.NewGuid() && e.Multiplicity == Multiplicity.Single),
Mock.Of<ICollectionInfo>(e => e.Id == Guid.NewGuid() && e.Multiplicity == Multiplicity.Single),
} &&
x.Properties == new List<IPropertyInfo>
{
Mock.Of<IPropertyInfo>(p => p.Id == Guid.NewGuid() && p.Name == "Foo" + Guid.NewGuid() && p.Type == "System.String"),
Mock.Of<IPropertyInfo>(p => p.Id == Guid.NewGuid() && p.Name == "Foo" + Guid.NewGuid() && p.Type == "System.String"),
});
Run Code Online (Sandbox Code Playgroud)
根据上面的答案,我猜当您主要想模拟属性时,Mock.Of<T>()
更容易,而当您想模拟方法等时,则更Mock<T>
容易。
var foo = Mock.Of<Foo>();
foo.Property1 = 1;
foo.Property2 = 2;
foo.Property3 = 3;
Run Code Online (Sandbox Code Playgroud)
var barMock = new Mock<Bar>();
barMock.Setup(bar => bar.GetValue1()).Returns(1);
barMock.Setup(bar => bar.GetValue2Async()).ReturnsAsync(2);
Run Code Online (Sandbox Code Playgroud)
两者的作用相同,但Mock.Of
代码更“自然”。
使用Mock<T>
看起来更像这样(或者像您的代码一样使用设置/返回):
var mockService = new Mock<ISomeService>();
mockService.SetupProperty(s => s.IsActive);
mockService.Object.IsActive = true;
mockService.SetupProperty(s =>s.DelayTime);
mockService.Object.DelayTime = 5000;
Run Code Online (Sandbox Code Playgroud)
使用Mock.Of<T>
您可以直接获取实例,并且可以设置您想要的值。您可以使用Mock.Get()
任何方法来配置:
var mockService = Mock.Of<ISomeService>();
mockService.IsActive = true;
mockService.DelayTime = 5000;
Mock.Get(mockService).Setup(s => s.ExecuteTask()).Returns(true);
Run Code Online (Sandbox Code Playgroud)
他们做同样的事情,但是对于具有大量属性和方法的更复杂的服务,我认为Mock.Of<T>
更具可读性
归档时间: |
|
查看次数: |
9410 次 |
最近记录: |