我试图看看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没有足够的样本供我使用,其中一些教程似乎使用过时的方法,也没有覆盖枚举,这对我来说很棘手:(
任何提示都将不胜感激。
答案 0 :(得分:11)
尝试
mockCrm.Setup(x => x.GetPickLists())
.Returns(new List<PickList>());
QuickStart是一个很好的参考。
其他方法的一些例子:
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
将匹配任何参数,这将使处理序列或集合参数时更容易。