问题 新手试图使用Moq进行可枚举的方法


我试图看看Moq是否是我想在新项目中使用的东西,因为我使用的其他模拟框架正在挑战恕我直言。所以,例如,我有一个方法:

IEnumerable<PickList> GetPickLists();

我不确定我该怎么嘲笑这个...我尝试过这样的事情,但是我得到了恭维错误(我知道以下内容) 返回()不正确,但无法弄清楚要在Return体中放入什么:

var mockCrm = new Mock<ICrmProvider>();
mockCrm.Setup<IEnumerable<PickList>>(foo => foo.GetPickLists())
              .Returns<IEnumerable<PickList>>({});

此外,尝试模拟这两种方法:

CustomerSyncResult ApplyActions(IEnumerable<CustomerAction> actions);
IEnumerable<Customer> GetCustomers(IEnumerable<string> crmIDs, IEnumerable<string> emails);

我知道我在问一个一揽子问题,但我有一段时间开始。下载中的CHM没有足够的样本供我使用,其中一些教程似乎使用过时的方法,也没有覆盖枚举,这对我来说很棘手:(

任何提示将非常感谢。


11310
2017-09-13 01:37


起源



答案:


尝试

mockCrm.Setup(x => x.GetPickLists())
    .Returns(new List<PickList>());

快速开始 是一个很好的参考。

其他方法的一些示例:

mockCrm.Setup(x => x.ApplyActions(It.IsAny<IEnumerable>()))
    .Returns(new CustomerSyncResult());

mockCrm.Setup(x => x.GetCustomers(It.IsAny<IEnumerable>(),
                                  It.IsAny<IEnumerable>()))
    .Returns(new List<Customers>());

另外,在原始界面中创建IEnumerable泛型以提高类型安全性。

您还可以使用新的Moq v4功能规范:

var list = new List<PickList> { new PickList() };

ICrmProvider crm =
    Mock.Of<ICrmProvider>(
        x =>
        x.GetPickLists() == list);

目前还没有详细记录。请注意,您不再需要写 mock.Object。一些链接:

确切的语法(使用It.Is,列表的内容等)将取决于您要完成的任务。 It.IsAny 将匹配任何参数,这将使处理序列或集合参数时更容易。


11
2017-09-13 02:01



太好了,谢谢!开始凝胶...... - Andrew Connell
坚持下去;这是一个很棒的图书馆。您可以将DLL导入 LINQPad 如果你愿意,可以玩嘲弄类型。 - TrueWill
后续问题...如果您要模拟的对象需要构造函数中的参数,该怎么办?例如:public CustomerSyncEngine(ILoggingProvider loggingProvider,ICrmProvider crmProvider,ICacheProvider cacheProvider)如何在那里获得构造函数的参数? - Andrew Connell
我在构造函数中处理具有参数的对象的方法是使用较旧的new = Mock <object>语法...我假设Mock.Of <>也可以处理它... - Andrew Connell
@AC - Mock.Of处理语法的子集。我建议问一下 Moq讨论。除非你需要覆盖虚方法,否则我会创建一个具体的CustomerSyncEngine(使用 new 关键字)并传入构造函数参数的模拟。 - TrueWill


答案:


尝试

mockCrm.Setup(x => x.GetPickLists())
    .Returns(new List<PickList>());

快速开始 是一个很好的参考。

其他方法的一些示例:

mockCrm.Setup(x => x.ApplyActions(It.IsAny<IEnumerable>()))
    .Returns(new CustomerSyncResult());

mockCrm.Setup(x => x.GetCustomers(It.IsAny<IEnumerable>(),
                                  It.IsAny<IEnumerable>()))
    .Returns(new List<Customers>());

另外,在原始界面中创建IEnumerable泛型以提高类型安全性。

您还可以使用新的Moq v4功能规范:

var list = new List<PickList> { new PickList() };

ICrmProvider crm =
    Mock.Of<ICrmProvider>(
        x =>
        x.GetPickLists() == list);

目前还没有详细记录。请注意,您不再需要写 mock.Object。一些链接:

确切的语法(使用It.Is,列表的内容等)将取决于您要完成的任务。 It.IsAny 将匹配任何参数,这将使处理序列或集合参数时更容易。


11
2017-09-13 02:01



太好了,谢谢!开始凝胶...... - Andrew Connell
坚持下去;这是一个很棒的图书馆。您可以将DLL导入 LINQPad 如果你愿意,可以玩嘲弄类型。 - TrueWill
后续问题...如果您要模拟的对象需要构造函数中的参数,该怎么办?例如:public CustomerSyncEngine(ILoggingProvider loggingProvider,ICrmProvider crmProvider,ICacheProvider cacheProvider)如何在那里获得构造函数的参数? - Andrew Connell
我在构造函数中处理具有参数的对象的方法是使用较旧的new = Mock <object>语法...我假设Mock.Of <>也可以处理它... - Andrew Connell
@AC - Mock.Of处理语法的子集。我建议问一下 Moq讨论。除非你需要覆盖虚方法,否则我会创建一个具体的CustomerSyncEngine(使用 new 关键字)并传入构造函数参数的模拟。 - TrueWill