NSubstitute - 模拟任何参数的参数行为
NSubstitute - mock out parameter behaviour for any parameter
我正在尝试使用 NSubstitute 模拟 IConfigurationProvider
。我需要方法 bool TryGet(string key, out string value)
到 return 不同键的值。所以像这样:
var configProvider = Substitute.For<IConfigurationProvider>();
configProvider.TryGet("key1", out Arg.Any<string>()).Returns(x =>
{ x[1] = "42"; return true; });
但这不编译。
我需要模拟方法将 out 参数实际设置为适当的值,无论该参数是什么 - 它是一个依赖项,被测单元使用自己的参数调用此方法,我只希望它 "return" (如 return 通过填写 out 参数)正确的键值。
这应该可以更全面地看待问题:
var value = "";
var configProvider = Substitute.For<IConfigurationProvider>();
configProvider
.TryGet("key1", out value)
.Returns(x => {
x[1] = "42";
return true;
});
var otherValue = "other";
configProvider.TryGet("key1", out value);
configProvider.TryGet("key1", out otherValue);
Assert.AreEqual("42", value); // PASS.
Assert.AreEqual("42", otherValue); // FAIL.
我需要两个断言都为真,因为这个方法将被测试class使用并且它可以自由传递它想要的任何输出参数,我只需要用“42”填充它。
configProvider.TryGet("key1", out Arg.Any<string>())
不是有效的 C# 语法,这就是它无法编译的原因。
您需要为 out 参数使用实际变量。
以下内容在测试时有效。
//Arrange
var expectedResult = true;
var expectedOut = "42";
var actualOut = "other";
var anyStringArg = Arg.Any<string>();
var key = "key1";
var configProvider = Substitute.For<IConfigurationProvider>();
configProvider
.TryGet(key, out anyStringArg)
.Returns(x => {
x[1] = expectedOut;
return expectedResult;
});
//Act
var actualResult = configProvider.TryGet(key, out actualOut);
//Assert
Assert.AreEqual(expectedOut, actualOut); // PASS.
Assert.AreEqual(expectedResult, actualResult); // PASS.
从 NSubstitute 4+ 开始,这是开箱即用的支持:
Matching out and ref args
Argument matchers can also be used with out and ref (NSubstitute 4.0
and later with C# 7.0 and later).
calculator
.LoadMemory(1, out Arg.Any<int>())
.Returns(x => {
x[1] = 42;
return true;
});
var hasEntry = calculator.LoadMemory(1, out var memoryValue);
Assert.AreEqual(true, hasEntry); Assert.AreEqual(42, memoryValue);
确保记下上面使用的参数索引 (x[1] = 42;
),此数组包括 输入和输出 变量,但您只能设置 out
变量。
我正在尝试使用 NSubstitute 模拟 IConfigurationProvider
。我需要方法 bool TryGet(string key, out string value)
到 return 不同键的值。所以像这样:
var configProvider = Substitute.For<IConfigurationProvider>();
configProvider.TryGet("key1", out Arg.Any<string>()).Returns(x =>
{ x[1] = "42"; return true; });
但这不编译。 我需要模拟方法将 out 参数实际设置为适当的值,无论该参数是什么 - 它是一个依赖项,被测单元使用自己的参数调用此方法,我只希望它 "return" (如 return 通过填写 out 参数)正确的键值。
这应该可以更全面地看待问题:
var value = "";
var configProvider = Substitute.For<IConfigurationProvider>();
configProvider
.TryGet("key1", out value)
.Returns(x => {
x[1] = "42";
return true;
});
var otherValue = "other";
configProvider.TryGet("key1", out value);
configProvider.TryGet("key1", out otherValue);
Assert.AreEqual("42", value); // PASS.
Assert.AreEqual("42", otherValue); // FAIL.
我需要两个断言都为真,因为这个方法将被测试class使用并且它可以自由传递它想要的任何输出参数,我只需要用“42”填充它。
configProvider.TryGet("key1", out Arg.Any<string>())
不是有效的 C# 语法,这就是它无法编译的原因。
您需要为 out 参数使用实际变量。
以下内容在测试时有效。
//Arrange
var expectedResult = true;
var expectedOut = "42";
var actualOut = "other";
var anyStringArg = Arg.Any<string>();
var key = "key1";
var configProvider = Substitute.For<IConfigurationProvider>();
configProvider
.TryGet(key, out anyStringArg)
.Returns(x => {
x[1] = expectedOut;
return expectedResult;
});
//Act
var actualResult = configProvider.TryGet(key, out actualOut);
//Assert
Assert.AreEqual(expectedOut, actualOut); // PASS.
Assert.AreEqual(expectedResult, actualResult); // PASS.
从 NSubstitute 4+ 开始,这是开箱即用的支持:
Matching out and ref args
Argument matchers can also be used with out and ref (NSubstitute 4.0 and later with C# 7.0 and later).
calculator .LoadMemory(1, out Arg.Any<int>()) .Returns(x => { x[1] = 42; return true; }); var hasEntry = calculator.LoadMemory(1, out var memoryValue); Assert.AreEqual(true, hasEntry); Assert.AreEqual(42, memoryValue);
确保记下上面使用的参数索引 (x[1] = 42;
),此数组包括 输入和输出 变量,但您只能设置 out
变量。