【发布时间】:2016-01-07 13:33:35
【问题描述】:
MOQ 支持输出参数的设置 - 没问题。我希望能够通过 Returns() 或 Callback() 根据调用中传递的内容设置参数。我的用例涉及使用 out 参数模拟方法。
这是我用来做实验的,到目前为止每次都是负面结果:
public interface ITestClass
{
string method(string inString, out string outString);
}
public class TestClass : ITestClass
{
public string method(string inString, out string outString)
{
outString = inString + " was passed in";
return (inString + " was returned");
}
}
[TestFixture]
public class OutTest
{
[Test]
public void Test()
{
//Arrange
Mock<ITestClass> mock = new Mock<ITestClass>(MockBehavior.Strict);
string stringParm = "value that will be assigned to out parameter";
mock.Setup(t => t.method(It.IsAny<string>(), out stringParm))
.Returns((string i, string o) =>
{
return i + " was returned"; // o = stringParm already
})
.Callback((string s, string oo) =>
{
stringParm = s + " was passed in"; // oo = stringParm already
});
TestClass real = new TestClass();
string testString = DateTime.Now.ToLongTimeString();
//Act
string realOut;
string mockOut;
string realResult = real.method(testString, out realOut);
string mockResult = mock.Object.method(testString, out mockOut);
//Assert
realResult.Should().Be(mockResult); // passes
realOut.Should().Be(mockOut); // fails - mockout = original stringParm
}
}
【问题讨论】:
-
我看到这是在 2009 年在 MOQ 基础之外实施的......但它还不能作为 MOQ 的一部分。 code.google.com/p/moq/issues/detail?id=176
-
@FabioSalvalai 不,那个问题是关于如何为 out 或 ref 赋值 - 我同意 MOQ 可以处理得很好。我的示例中的 stringParm 变量以这种方式工作。我想要做的是在回调或返回块中设置 out 参数的值 - 这样它的值就会受到其他传递参数的影响。
-
好的,知道了。我将发布一个解决方法作为建议的答案。