【问题标题】:Moq Mock.Of<Obj> vs new Obj();Moq Mock.Of<Obj> vs new Obj();
【发布时间】:2018-03-07 07:13:46
【问题描述】:

我最近做了很多单元测试,我从Moq 库中发现了Mock.Of&lt;T&gt; 方法。在阅读this 和最终that 之后,我发现Mock.Of 是创建模拟接口实例的绝佳选择,但是我可以通过new 关键字自己制作对象的常规类呢?一些Nunit 教程使用了这种方法,这让我感到困惑,因为我觉得它没有任何用处。

    Person newPerson = new Person() { Name = "David", Surname = "Smith" };
    Person mockedPerson = Mock.Of<Person>(o => o.Name == "David" && o.Surname == "Smith");

这两个对象有什么区别吗?在这种情况下Mock.Of 有什么优势还是我应该使用常规的new 关键字来创建新的类实例?

【问题讨论】:

    标签: c# nunit tdd moq


    【解决方案1】:

    我认为您展示的代码完全忽略了模拟的重点。 模拟应该适用于接口和抽象类,因此您不必创建实际对象。要么你创建一个对象的模拟

    因此,您可以执行Mock.Of&lt;Person&gt;,然后分配一些测试所需的值,但您不做的是首先创建对象并设置它,然后创建它的模拟。

    假设你有这样的代码:

    public interface IPerson
    {
         some method and property signatures
    }
    

    那么你有

    public class Person : IPerson
    { 
        some code here
    }
    

    现在假设您有一个以 IPerson 作为参数的方法

    然后您可以执行以下操作:

    var mockedPerson = Mock.Of<IPerson>();
    mockedPerson.Age = 27;
    
    int age = GetAge(mockedPerson);
    Assert.AreEqual(age, 27)
    

    创建一个实际对象的模拟对我来说毫无意义。

    【讨论】:

    • 是的,我完全同意你的看法。这就是为什么当我在一些教程中看到这种方法时我会如此困惑,这也是我带着这个问题来到这里的原因。可悲的是,我失去了资源,所以我无法指出这些教程
    猜你喜欢
    • 1970-01-01
    • 2016-03-20
    • 2019-10-07
    • 2014-04-12
    • 1970-01-01
    • 2014-02-16
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多