我试图用Delphi Mocks框架测试一个创建简单值对象并将它们传递给协作者的类。如何检查这些对象的内容?
代码的一般概念是这样的:
TData = class
Code : string;
Field1 : string;
Field2 : string;
end;
IReceiver = interface
procedure Process(aData : TData);
end;
TSUTClass = class
public
procedure DoSomething(const aCode : string);
property Receiver : IReceiver;
end;
因此,当调用DoSomething
时,TSUTClass
应该生成TData
的多个实例,并将它们逐个传递给Receiver.Process
。我可以使用此设置验证正确的呼叫计数:
Mock := TMock<IReceiver>;
Mock.Setup.Expect.Exactly('Process', ExpectedCount);
但是如何检查Field1
和Field2
的值是否正确?
答案 0 :(得分:3)
mock有一个WillExecute
方法,您可以在其中传递一个匿名方法,该方法将在调用mock时执行。您可以评估传递的TData
个对象。不幸的是,经过快速查看后,您似乎无法将WillExecute
与预期的通话次数合并。
使用与Delphi Mocks非常相似的DSharp Mocks,它看起来像这样:
var
mock: Mock<IReceiver>;
sut: TSUTClass;
callCount: Integer;
begin
sut := TSUTClass.Create(mock);
callCount := 0;
mock.Setup.WillExecute(
function(const args: TArray<TValue>; const ReturnType: TRttiType): TValue
var
data: TData;
begin
Inc(callCount);
data := args[0].AsType<TData>;
case callCount of
1:
begin
CheckEquals('xyz', data.Field1);
CheckEquals('abc', data.Field2);
end;
2: ///...
end;
end).Exactly(2).WhenCallingWithAnyArguments.Process(nil);
sut.DoSomething('x');
end;