I did a first try with MockSequence, simply defining an interface to test like this:
ISequenceTest = interface(IInvokable)
procedure DoValue(ANumber: integer);
end;A class to be tested defined like this:
TSequenceTestObject = class
private
FSequenceTest: ISequenceTest;
public
constructor Create(ASequenceTest: ISequenceTest);
procedure Run(AValueA, AValueB: integer);
end;
and implementations like this:
constructor TSequenceTestObject.Create(ASequenceTest: ISequenceTest);
begin
inherited Create;
FSequenceTest := ASequenceTest;
end;
procedure TSequenceTestObject.Run(AValueA, AValueB: integer);
begin
FSequenceTest.DoValue(AValueA);
FSequenceTest.DoValue(AValueB);
end;
Now if I declare a test like this:
procedure TMyTestObject.DoSequenceTest;
var
Sequence: MockSequence;
obj : TSequenceTestObject;
testIfc : Mock<ISequenceTest>;
begin
Sequence.Reset;
testIfc := Mock<ISequenceTest>.Create(TMockBehavior.Strict);
testIfc.Setup(Sequence).Executes.When.DoValue(9);
testIfc.Setup(Sequence).Executes.When.DoValue(4);
obj := TSequenceTestObject.Create(testIfc);
try
obj.Run(4, 9);
finally
obj.Free;
end;
Assert.isTrue(Sequence.Completed);
end;
Calling this I never get to the Assert call at the end. There is an exception about unexpected call to DoValue with value 4. Good enough I would say, but the Completed method seems to be out of date?
/Anders