【问题标题】:Trying to create Moq object尝试创建 Moq 对象
【发布时间】:2012-03-01 17:59:39
【问题描述】:

我有一个方法,它接受 IList<Person> 并返回一个 IEnumberable,如下所示:

 internal static IEnumerable<Dictionary<string, string>> GetPersonsPerSite(IList<Person> Data)
    { 
         //Implementation ...
    }

我正在尝试创建一个 IList&lt;Person&gt; 的模拟对象,以便我可以测试这个方法。

使用 Moq 我写了以下内容:

var mockObjects = new Mock&lt;IList&lt;Person&gt;&gt;();

mockObjects.Setup(x => x[0]).Returns(new Person()
                                                 {
                                                        SITE_ID = "test",
                                                        MPAN = "test",
                                                        ADDLINE1 = "test",
                                                        ADDLINE2 = "test",
                                                        ADDRESS_LINE_1 = "test",
                                                        ADDRESS_LINE_2 = "test"
                                                 });

但是,当我开始使用 IEnumerable 返回的对象时,会抛出异常Object reference not set to an instance of an object.

我是 Moq 的新手,我很确定我在这里遗漏了一个基本概念,但是我已经成功地能够抛出异常并使用其他模拟对象修改输出。

如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

    标签: c# unit-testing testing mocking moq


    【解决方案1】:

    不要模拟 IList。不需要,除非有特定的东西要检查。

    而只是让您的测试保持简单并执行以下操作:

    var testData = new List<Person>(){new Person()
                                                     {
                                                            SITE_ID = "test",
                                                            MPAN = "test",
                                                            ADDLINE1 = "test",
                                                            ADDLINE2 = "test",
                                                            ADDRESS_LINE_1 = "test",
                                                            ADDRESS_LINE_2 = "test"
                                                     }};
    var result = GetPersonsePerSite(testData);
    

    【讨论】:

    • 好的,我明白我一定是把事情复杂化了
    • @m.edmondson 没关系。很容易将模拟应用于您看到的每个界面,而忘记它只是为了帮助您处理具有外部交互或难以设置的对象。 IList 是自包含且易于实例化的,因此您不妨使用真实的东西。
    【解决方案2】:

    您获得的代码看起来不错,并且对我有用。您能否扩展一个实际使用 mockObjects.Object 并发现它为空的示例?

    另外,你真的需要模拟你的IList&lt;Person&gt; 吗? 如果您只是使用它为被测方法提供测试数据,只需使用具体列表 - 为此使用模拟没有任何好处。

    当然,您可能正在模拟它,以便您可以验证对其执行的某些操作(调用的方法、访问的属性等)——在这种情况下是不同的。

    【讨论】:

    • 抱歉我的问题是错误的,我是根据昨天的记忆写的,没有检查。实际问题是从该方法返回的 IEnumberable 导致异常 {"Object reference not set to an instance of an object."} 暗示我没有在 Moq 声明中设置某些内容。
    • 你的意思是列表返回的可枚举吗?
    • 没有IEnumerable&lt;Dictionary&lt;string, string&gt;&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2014-08-09
    相关资源
    最近更新 更多