Forjando Parâmetros De Saída Com Typemock Isolator
Há algum tempo perguntaram-me se seria possível forjar parâmetros de saída usando o Typemock Isolator.
Na verdade é muito fácil de o fazer usand qualquer uma das APIs disponíveis.
Dada esta classe:
public class MyClass
{
public bool MyMethod(string input, out int output1, out double output2)
{
throw new NotImplementedException();
}
}
Usando a nova API AAA, é tão limpo omo:
[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);
}
Usando Natural Mocks, é tão fácil como:
[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);
}
Também é possível usando 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);
}
Só é preciso escolher a API de que se gosta mais.