使用 SetupGet 回调 Moq Index 属性

tri*_*idy 5 c# indexing properties moq mocking

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

延期:

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

测试:

[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);
}
Run Code Online (Sandbox Code Playgroud)

我试图看到当执行 getter 并发送密钥时,它将带有 IConfiguration 的 index 属性的前缀。我的问题是我无法使回调部分与参数一起工作,例如: .Callback<string>((key) => keySet = key)

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

谢谢!

Nko*_*osi 6

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);
}
Run Code Online (Sandbox Code Playgroud)