为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
哈士奇WWW 2021-11-21 11:05:09
我有一个包含数十种方法的类 - 我只需要使用其中两个方法并避免依赖注入。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>()));我一直在寻找“带参数的最小起订量方法”,但到目前为止,没有一个结果能回答我的问题。也许我在这里寻找错误的关键字。
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

您可以通过使用Func重载 forReturns()提供一个接受与您正在模拟的方法完全相同的参数的 lambda来访问模拟方法委托中的调用参数。Moq 会将任何提供的参数传递给您的委托。


文档中的示例:


// access invocation arguments when returning a value

mock.Setup(x => x.DoSomethingStringy(It.IsAny<string>()))

    .Returns((string s) => s.ToLower());

注意 1如果您正在模拟具有任何默认参数的方法,则必须明确提供这些参数。


注意 2值得一提的Callback是,如果您需要修改未返回的对象,或者您需要根据调用次数更改 Mock 行为,该选项很有用。 https://github.com/Moq/moq4/wiki/Quickstart#callbacks


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


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信