C# 使用SetupGet进行Moq索引属性回调
我正在尝试为扩展方法编写测试,该扩展方法为发送到IConfiguration的index属性的键添加前缀: 分机: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]; } } 测试:
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);