C# 使用SetupGet进行Moq索引属性回调

C# 使用SetupGet进行Moq索引属性回调,c#,indexing,properties,mocking,moq,C#,Indexing,Properties,Mocking,Moq,我正在尝试为扩展方法编写测试,该扩展方法为发送到IConfiguration的index属性的键添加前缀: 分机: public static class IConfigurationExt { public static string GetDomainValue(this IConfiguration configuration, string key) { return configuration["domain." + key]; } } 测试:

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

分机:

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

[测试]
public void GetInexKeyAsCallback()
{
字符串键集=空;
Mock configurationMock=新的Mock(MockBehavior.Strict);
configurationMock.SetupGet(p=>p[It.IsAny())

.Callback(()=>keySet=“assign key here”)//
SetupGet
没有允许访问传递参数的
回调

改用
设置
,然后
回调
可以通过在委托中包含参数来访问传递的参数

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);
}
public void GetInexKeyAsCallback(){
//安排
字符串实际值=null;
字符串应为=“domain.testKey”;
Mock configurationMock=新的Mock(MockBehavior.Strict);
配置模拟

.Setup(=>\uit.IsAny())//actual=arg)//从内存中需要更改

Callback(() =>

回调(x=>

虽然您已经有了答案,但我想建议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);

//排列
常量字符串expectedKey=“testKey”;
Mock configurationMock=新的Mock(MockBehavior.Strict);
configurationMock.SetupGet(p=>p[It.IsAny()])。返回(“mock”);
//表演
_=configurationMock.Object.GetDomainValue(expectedKey);
//断言
configurationMock.Verify(m=>m[$”域{expectedKey}],次.Once);

只是想知道为什么不使用
Verify
而不是
Callback
?@Johnny这是一个很好的观察。
Callback
带参数的SetupSet可以使用,但setupgethanks不能使用!我将查看
Verify
功能。这个功能将验证属性是否用这个键调用了1次,ra而不是在调用发生时做出反应。使用
.VerifyGet()
而不是
.Verify()
会更准确吗?因为我处理的是属性?品味问题。我个人总是使用Verify,但是的,你肯定可以使用VerifyGet。。。
Callback<string>( x =>
// 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);