Решение LukeW может работать, если вам нужно всего два последовательных вызова. Но с более длинной последовательностью он может стать слишком сложным. Вы можете решить это намного проще с Typemock Isolator. Взгляните на приведенный ниже пример:
public class ClassUnderTest
{
public void OutputANumber(out int number)
{
number = 3;
}
}
[TestMethod, Isolated]
public void TestOutSequence()
{
//Arrange
var n = new ClassUnderTest();
int number = 1;
Isolate.WhenCalled(() => n.OutputANumber(out number)).IgnoreCall();
number = 2;
Isolate.WhenCalled(() => n.OutputANumber(out number)).IgnoreCall();
Isolate.WhenCalled(() => n.OutputANumber(out number)).CallOriginal();
//Act
var res1 = 0;
var res2 = 0;
var resOriginal = 0;
var resDefault = 0;
n.OutputANumber(out res1);
n.OutputANumber(out res2);
n.OutputANumber(out resOriginal);
n.OutputANumber(out resDefault);
//Assert
Assert.AreEqual(1, res1);
Assert.AreEqual(2, res2);
Assert.AreEqual(3, resOriginal);
Assert.AreEqual(3, resDefault);
}
Не нужно создавать фиктивные объекты или дополнительные методы. По последовательного определения из параметров и с помощью Isolate.WhenCalled() вы можете установить любую последовательность выходных параметров:
int number = 1;
Isolate.WhenCalled(() => n.OutputANumber(out number)).IgnoreCall();
Последний вызов Isolate.WhenCalled() определяет поведение по умолчанию для метода с этого момента. Итак, в этом примере я вернул первоначальную реализацию, которая будет вызвана после поддельных вызовов:
Isolate.WhenCalled(() => n.OutputANumber(out number)).CallOriginal();