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

And*_*ell 11 moq

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

IEnumerable<PickList> GetPickLists();
Run Code Online (Sandbox Code Playgroud)

我不确定我该怎么嘲笑这个...我尝试过类似的东西,但是我得到了恭维错误(我知道以下的Returns()不正确,但是无法弄清楚什么放在Return体中:

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

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

CustomerSyncResult ApplyActions(IEnumerable<CustomerAction> actions);
IEnumerable<Customer> GetCustomers(IEnumerable<string> crmIDs, IEnumerable<string> emails);
Run Code Online (Sandbox Code Playgroud)

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

任何提示将非常感谢.

Tru*_*ill 12

尝试

mockCrm.Setup(x => x.GetPickLists())
    .Returns(new List<PickList>());
Run Code Online (Sandbox Code Playgroud)

快速入门是一个很好的参考.

其他方法的一些示例:

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>());
Run Code Online (Sandbox Code Playgroud)

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

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

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

ICrmProvider crm =
    Mock.Of<ICrmProvider>(
        x =>
        x.GetPickLists() == list);
Run Code Online (Sandbox Code Playgroud)

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

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