Moq可以模拟行为以便使用表达式方法参数吗?

时间:2018-08-08 21:52:58

标签: c# moq

我有一类具有数十种方法的类-我只真正需要使用其中的两种方法并避免依赖项注入。

Task<List<ApplicationUser>> GetAllContractors(CancellationToken cancellationToken);
Task<ApplicationUser> FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken);

我当前的尝试:(因为我不需要任何参数即可生效,因此可以轻松地为所有承包商工作)

users.AddRange(await ManifestJsonLoader.LoadAsync<List<ApplicationUser>>("Mynamespace.sampleUsers.json"));
var userProviderMock = new Mock<IUserProvider>(MockBehavior.Strict);
userProviderMock.Setup(service => service.GetAllContractors(CancellationToken.None)).Returns(Task.FromResult(users));
userProviderMock.Setup(service => service.FindByNameAsync(It.Is<string>(name => users.FirstOrDefault(d => d.UserName == name) != null), It.IsAny<CancellationToken>()));

我一直在寻找“带有参数的moq方法”,但到目前为止,没有结果能回答我的问题。也许我在这里找错了关键字。

1 个答案:

答案 0 :(得分:1)

您可以通过使用Func的{​​{1}}重载来提供lambda来接受模拟方法委托中的调用参数,该lambda接受与您所使用的方法完全相同的参数嘲笑。 Moq会将提供的所有参数传递给您的代表。

文档示例:

Returns()
  

注释1 如果要模拟具有任何默认参数的方法,则必须显式提供这些参数。

     

注释2 值得一提的是// access invocation arguments when returning a value mock.Setup(x => x.DoSomethingStringy(It.IsAny<string>())) .Returns((string s) => s.ToLower()); 选项,如果您需要修改不返回的对象,或者需要根据拨打电话。   https://github.com/Moq/moq4/wiki/Quickstart#callbacks

维基页面上有很好的例子:https://github.com/Moq/moq4/wiki/Quickstart