【问题标题】:Moq Index property Callback with SetupGet使用 SetupGet 回调 Moq Index 属性
【发布时间】:2020-02-08 19:53:55
【问题描述】:

我正在尝试为扩展方法编写一个测试,该方法为发送到 IConfiguration 的索引属性的键添加前缀:

扩展名:

public static class IConfigurationExt
{
    public static string GetDomainValue(this IConfiguration configuration, string key)
    {
        return configuration["domain." + key];
    }
}

测试:

[Test]
public void GetInexKeyAsCallback()
{
    string keySet = null;

    Mock<IConfiguration> configurationMock = new Mock<IConfiguration>(MockBehavior.Strict);

    configurationMock.SetupGet(p => p[It.IsAny<string>()])
                        .Callback(() => keySet = "assign key here") // <<< the part here needs the parameter
                        .Returns("mock");

    IConfiguration configuration = configurationMock.Object;

    var result = configuration.GetDomainValue("testKey");

    Assert.AreEqual(expected: "domain.testKey", actual: keySet);
}

我试图看到,当执行 getter 并发送密钥时,它将带有 IConfiguration 的索引属性的前缀。 我的问题是我无法使回调部分使用参数,例如: 以.Callback&lt;string&gt;((key) =&gt; keySet = key) 为例。

有没有办法获取发送到索引属性的键? 它适用于SetupSet,但不适用于SetupGet

谢谢!

【问题讨论】:

  • 只是想知道为什么不用Verify 而不是Callback
  • @Johnny 这是一个很好的观察。

标签: c# indexing properties mocking moq


【解决方案1】:

SetupGet 没有允许访问传递参数的Callback

改为使用Setup,然后Callback 可以通过在委托中包含参数来访问传递的参数

public void GetInexKeyAsCallback() {
    //Arrange
    string actual = null;
    string expected = "domain.testKey";

    Mock<IConfiguration> configurationMock = new Mock<IConfiguration>(MockBehavior.Strict);

    configurationMock
        .Setup(_ => _[It.IsAny<string>()]) // <-- Use Setup
        .Callback((string arg) => actual = arg) // <<< the part here gets the parameter
        .Returns("mock");

    IConfiguration configuration = configurationMock.Object;

    //Act
    var result = configuration.GetDomainValue("testKey");

    //Assert
    Assert.AreEqual(expected, actual);
}

【讨论】:

    【解决方案2】:

    虽然您已经有了答案,但我想建议 IMO 更适合您所描述的问题的另一种方法。

    我正在尝试查看当执行 getter 并发送密钥时, 它将带有 IConfiguration 的 index 属性的前缀。

    Verify 用于这种情况,而不是Callback。你可以把你的测试改写成这样:

    // Arrange
    const string expectedKey = "testKey";
    Mock<IConfiguration> configurationMock = new Mock<IConfiguration>(MockBehavior.Strict);
    configurationMock.SetupGet(p => p[It.IsAny<string>()]).Returns("mock");
    
    // Act
    _ = configurationMock.Object.GetDomainValue(expectedKey);
    
    // Assert
    configurationMock.Verify(m => m[$"domain.{expectedKey}"], Times.Once);
    
    

    【讨论】:

    • 谢谢!我将看看Verify 功能。这将验证属性 调用了 1 次,而不是响应 when 调用发生。
    • 因为我正在处理属性,所以使用 .VerifyGet() 而不是 .Verify() 会更准确吗?
    • 品味之母。就我个人而言,我总是使用验证,但是是的,您肯定可以使用 VerifyGet...
    【解决方案3】:

    从记忆中你需要改变

    Callback(() =>
    

    Callback<string>( x =>
    

    【讨论】:

    • Callback&lt;string&gt; 参数适用于 SetupSet,但不适用于 SetupGet
    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2015-11-19
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多