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 =&gt; m.GetRootValue("ss", It.IsAny&lt;string&gt;())).Returns("aaa"); 设置了返回值 - 即使用键“ss”调用时,没有其他值。第二次调用没有设置返回值,所以得到默认返回值null

总的来说,我认为使用MockBehavior.Strict 创建模拟是有帮助的。这会在运行单元测试时为您提供有关意外调用的信息。构造函数如下所示;

var settingsMock = new Mock<IECSConfigSettings>(MockBehavior.Strict);

如果您想返回相同的值而不考虑参数值,您也可以将It.IsAny&lt;string&gt;() 用于第一个参数。

settingsMock.Setup(m => m.GetRootValue(It.IsAny<string>(), It.IsAny<string>())).Returns("aaa");

【讨论】:

感谢您的解释。我想我确实打算在 BuildSettingCacheForMock 函数中设置一个返回值,并且我在调用实际调用之前调用了它。但不知道为什么程序将其视为未设置。 如果您尝试 Strict 行为,您将看到您没有为第二次调用设置返回值。您只设置了电话m.GetRootValue("ss", [any value]) 是的,但我很困惑,不应该 BuildSettingCacheForMock(settingsMock, "sss", "aaa1");已经设置通话了吗? 它只设置对该特定参数值(“ss”)的调用。每个其他参数值都会给你空值。如果你想设置所有值,你需要在设置中写 It.IsAny&lt;string&gt;() 而不是“ss”。 第二种设置mock的方式,BuildSettingCacheForMock函数调用mock.Setup(m => m.GetRootValue(key, It.IsAny())).Returns (值),所以如果我用(“sss”,“aaa1”)调用它,“sss”也应该为那个模拟设置,对吧?

以上是关于Moq - 通用设置不返回预期值的主要内容,如果未能解决你的问题,请参考以下文章

PHP通用返回值设置

无法将协议的通用关联类型的值转换为预期的参数类型

iOS 通用链接无法按预期工作 - 无论路径如何,都始终打开

MOQ - 根据参数值(多个参数)设置方法

第一次和第二次使用 Moq 时返回值不同

一个相对通用的JSON响应结构,其中包含两部分:元数据与返回值