我正在尝试使用NSubstitute模拟IConfigurationProvider
。我需要方法bool TryGet(string key, out string value)
返回不同键的值。像这样:
var configProvider = Substitute.For<IConfigurationProvider>();
configProvider.TryGet("key1", out Arg.Any<string>()).Returns(x =>
{ x[1] = "42"; return true; });
但是不会编译。 我需要一个模拟方法来实际将out参数设置为适当的值,而不管该参数是什么-它是一个依赖项,被测单元使用自己的参数调用此方法,而我只是希望它“返回”(如通过填充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.
我需要两个断言都为真,因为该方法将由测试的类使用,并且可以自由传递任何所需的out参数,我只需要用“ 42”填充它即可。
答案 0 :(得分:3)
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.
答案 1 :(得分:1)
从NSubstitute 4+开始,此功能即受支持:
匹配并引用args
参数匹配器也可以与out和ref(NSubstitute 4.0 以及C#7.0和更高版本)。
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);