对于Moq库,我决定使用LINQ来设置模拟。我已经看到了很多示例,这些示例解释了在使用“传统”方法设置模拟时如何使用.Returns访问方法的参数值。
但是你是如何使用的呢?下面是不运行的代码,因为我找不到命名val的方法。val应该是第二个参数的值。(UpdatedValue是单元测试的局部变量。)
IAppSettingLogic MoqAsl = Mock.Of<IAppSettingLogic>(asl =>
asl.SetAppSettingAsync(AppSettings.LatestReconciliationValue, It.IsAny<string>(), It.IsAny<string>()) ==
Task.Run(() => UpdatedValue = val));发布于 2019-09-05 18:03:23
对于您所描述的复杂场景,通常使用传统的格式,因为linq更适合简单的快速设置。Linq to mock不允许访问参数值。
var UpdateValue = string.Empty;
var mock = new Mock<IAppSettingLogic>();
mock
.Setup(_ => _.SetAppSettingAsync(AppSettings.LatestReconciliationValue, It.IsAny<string>(), It.IsAny<string>())
.Returns( (string arg0, string val, string args3) => {
UpdatedValue = val;
return Task.CompletedTask;
});
IAppSettingLogic MoqAsl = mock.Object;LINQ对于快速排除通常不需要进一步验证的依赖关系是很好的。如果以后确实需要在这些模拟上验证某些调用,则可以使用
Mock.Get(instance)轻松地检索它们。
如果您有一些简单的成员可以被模拟,那么您可以混合这两种格式。
//Ling to Mock
IAppSettingLogic MoqAsl = Mock.Of<IAppSettingLogic>(asl => asl.SimpleMember == someSimpleValue);
//Add traditional setup to get access to return function using "Mock.Get(T)"
Mock.Get(MoqAsl)
.Setup(_ => _.SetAppSettingAsync(AppSettings.LatestReconciliationValue, It.IsAny<string>(), It.IsAny<string>())
.Returns( (string arg0, string val, string args3) => {
UpdatedValue = val;
return Task.CompletedTask;
});https://stackoverflow.com/questions/57810540
复制相似问题