MOQ supports setups for out parameters - no problem. I'd like to be able to set the parameter based on what's passed in the invocation, via Returns() or Callback(). My use case involves mocking out a method with an out parameter.
Here is what I am using to experiment, so far with negative results each time:
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
}
}