Faking Output Parameters With Typemock Isolator
Some time ago I was asked if it was possible to fake output parameters with Typemock Isolator.
It’s actually very easy using any of the APIs.
Given this class:
public class MyClass { public bool MyMethod(string input, out int output1, out double output2) { throw new NotImplementedException(); } }
Using the new AAA API, it's as clean as:
[TestMethod] [Isolated] public void TestMethodIsolated() { MyClass target = Isolate.Fake.Instance<MyClass>(); string input = "test value"; int expectedOutput1 = 1; double expectedOutput2 = 2; Isolate.WhenCalled(() => target.MyMethod(input, out expectedOutput1, out expectedOutput2)).WillReturn(true); int output1; double output2; bool result = target.MyMethod(input, out output1, out output2); Assert.IsTrue(result); Assert.AreEqual<int>(expectedOutput1, output1); Assert.AreEqual<double>(expectedOutput2, output2); }
Using Natural Mocks, it's as easy as:
[TestMethod] [VerifyMocks] public void TestMethodNatural() { MyClass target = RecorderManager.CreateMockedObject<MyClass>(); string input = "test value"; int expectedOutput1 = 1; double expectedOutput2 = 2; using (RecordExpectations recorder = RecorderManager.StartRecording()) { recorder.ExpectAndReturn(target.MyMethod(input, out expectedOutput1, out expectedOutput2), true); } int output1; double output2; bool result = target.MyMethod(input, out output1, out output2); Assert.IsTrue(result); Assert.AreEqual<int>(expectedOutput1, output1); Assert.AreEqual<double>(expectedOutput2, output2); }
It's also possible using Reflective Mocks:
[TestMethod] [VerifyMocks] public void TestMethodReflective() { MockObject<MyClass> targetMock = MockManager.MockObject<MyClass>(); string input = "test value"; int expectedOutput1 = 1; double expectedOutput2 = 2; targetMock.ExpectAndReturn( "MyMethod", new DynamicReturnValue(delegate(object[] parameters, object context) { parameters[1] = expectedOutput1; parameters[2] = expectedOutput2; return true; })); int output1; double output2; bool result = targetMock.Object.MyMethod(input, out output1, out output2); Assert.IsTrue(result); Assert.AreEqual<int>(expectedOutput1, output1); Assert.AreEqual<double>(expectedOutput2, output2); }
All you have to do is choose which one you like most.