首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mock.Of<Object>诉Mock<Object>()

Mock.Of<Object>诉Mock<Object>()
EN

Stack Overflow用户
提问于 2016-05-05 04:53:55
回答 5查看 36.8K关注 0票数 65

我现在对如何嘲弄感到困惑。

我在用莫克。为了模拟对象,我通常是这样写的

代码语言:javascript
运行
复制
 var mockIRepo = new Mock<IRepo>();

但是,我需要为我的设置创建模拟对象。

Option1这样模拟只包含属性的对象更好吗?

代码语言:javascript
运行
复制
 var object = Mock.Of<Object>()

Option2还是这边

代码语言:javascript
运行
复制
 var object = new Mock<Object>()

我读过选项2有setupproperties,这对我来说有点问题,因为我也可以在选项1中设置属性。

,那么有什么区别呢?或者有更好的方法?

EN

回答 5

Stack Overflow用户

发布于 2016-12-19 15:16:27

这篇文章帮助我理解了Mock.Of:vs功能Mock.Of

正如文章中所解释的,在Mock.Of中,您说的是“给我一个类似于此行为的模拟”(如果需要获取许多对象(IEnumerable),请使用mock .Of)。它使模拟声明更加简洁。

Mock示例(返回一个Mock)

代码语言:javascript
运行
复制
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;

使用Mock.Of的同一个示例(返回类的一个实例)

代码语言:javascript
运行
复制
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"),
});
票数 68
EN

Stack Overflow用户

发布于 2020-07-20 05:32:22

基于上面的答案,我猜当您主要想模拟属性时,Mock.Of<T>()更容易,而当您想要模拟方法等等时,Mock<T>就更容易了。

  • 主要是模仿属性:
代码语言:javascript
运行
复制
var foo = Mock.Of<Foo>();
foo.Property1 = 1;
foo.Property2 = 2;
foo.Property3 = 3;
  • 主要是模仿方法:
代码语言:javascript
运行
复制
var barMock = new Mock<Bar>();
barMock.Setup(bar => bar.GetValue1()).Returns(1);
barMock.Setup(bar => bar.GetValue2Async()).ReturnsAsync(2);
票数 16
EN

Stack Overflow用户

发布于 2020-07-13 14:26:06

两者都这样做,但对于Mock.Of,这是更“自然”的代码。

使用Mock<T>看起来更像这样(或者安装/返回类似于您的代码):

代码语言:javascript
运行
复制
var mockService = new Mock<ISomeService>();
mockService.SetupProperty(s => s.IsActive);
mockService.Object.IsActive = true;
mockService.SetupProperty(s =>s.DelayTime);
mockService.Object.DelayTime = 5000;

使用Mock.Of<T>,您可以直接获得实例,并且可以设置所需的值。您可以使用Mock.Get()配置任何方法:

代码语言:javascript
运行
复制
var mockService = Mock.Of<ISomeService>();
mockService.IsActive = true;
mockService.DelayTime = 5000;
Mock.Get(mockService).Setup(s => s.ExecuteTask()).Returns(true);

它们也这样做,但是对于具有许多属性和方法的更复杂的服务,我认为Mock.Of<T>更易读。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37042633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档