试图创建Moq对象

时间:2012-02-09 09:04:19

标签: c# unit-testing testing mocking moq

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

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

并且我正在尝试创建IList<Person>的模拟对象,以便我可以测试此方法。

使用Moq我写了以下内容:

var mockObjects = new Mock<IList<Person>>();

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的新手,我很确定我在这里缺少一个基本概念,但是我已经成功地能够使用其他模拟对象抛出异常和修改输出。

如果有人能指出我正确的方向,我会很感激。

2 个答案:

答案 0 :(得分:5)

不要嘲笑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);

答案 1 :(得分:3)

你到那里的代码看起来很好,并且对我有用。你能扩展一下你实际使用mockObjects.Object的地方的例子并找到它吗?

另外,你真的需要嘲笑你的IList<Person>吗? 如果您只是使用它来为测试中的方法提供测试数据,那么只需使用一个具体的列表 - 使用模拟就没有任何好处。

当然,您可能正在嘲笑它,以便您可以验证对其采取的某些操作(调用的方法,访问的属性等) - 在这种情况下是不同的。