Moq - 通用设置不返回预期值
Posted
技术标签:
【中文标题】Moq - 通用设置不返回预期值【英文标题】:Moq - Generic set up don't return expected value 【发布时间】:2022-01-14 22:46:15 【问题描述】:我是 Moq 新手,这里有两个设置。
var settingsMock = new Mock<IECSConfigSettings>();
settingsMock.Setup(m => m.GetRootValue("ss", It.IsAny<string>())).Returns("aaa");
还有一个是
private static void BuildSettingCacheForMock<T>(Mock<IECSConfigSettings> mock, string key, T value)
mock.Setup(m => m.GetRootValue<T>(key, It.IsAny<T>())).Returns(value);
mock.Setup(m => m.GetValue<T>(key, It.IsAny<T>())).Returns(value);
mock.Setup(m => m.TryGetValue<T>(key, out value)).Returns(true);
mock.Setup(m => m.TryGetRootValue<T>(key, out value)).Returns(true);
var settingsMock = new Mock<IECSConfigSettings>();
BuildSettingCacheForMock<string>(settingsMock, "sss", "aaa1");
最后当我同时调用它们时
var s1 = new SettingsETag(settingsMock.Object, etag: "ETag", null).Settings.GetRootValue("ss"); // gives "aaa"
var s2 = new SettingsETag(settingsMock.Object, etag: "ETag", null).Settings.GetRootValue("sss"); // gives null
界面细节 Interface code
我不知道这些之间有什么区别以及为什么第二个的结果为空。感谢您对此的看法!
【问题讨论】:
请将界面定义(相关部分)添加为文本,而不是图像。 【参考方案1】:您已为特定调用 settingsMock.Setup(m => m.GetRootValue("ss", It.IsAny<string>())).Returns("aaa");
设置了返回值 - 即使用键“ss”调用时,没有其他值。第二次调用没有设置返回值,所以得到默认返回值null
。
总的来说,我认为使用MockBehavior.Strict
创建模拟是有帮助的。这会在运行单元测试时为您提供有关意外调用的信息。构造函数如下所示;
var settingsMock = new Mock<IECSConfigSettings>(MockBehavior.Strict);
如果您想返回相同的值而不考虑参数值,您也可以将It.IsAny<string>()
用于第一个参数。
settingsMock.Setup(m => m.GetRootValue(It.IsAny<string>(), It.IsAny<string>())).Returns("aaa");
【讨论】:
感谢您的解释。我想我确实打算在 BuildSettingCacheForMock 函数中设置一个返回值,并且我在调用实际调用之前调用了它。但不知道为什么程序将其视为未设置。 如果您尝试 Strict 行为,您将看到您没有为第二次调用设置返回值。您只设置了电话m.GetRootValue("ss", [any value])
是的,但我很困惑,不应该 BuildSettingCacheForMockIt.IsAny<string>()
而不是“ss”。
第二种设置mock的方式,BuildSettingCacheForMock函数调用mock.Setup(m => m.GetRootValue以上是关于Moq - 通用设置不返回预期值的主要内容,如果未能解决你的问题,请参考以下文章