如何使用Delphi Mocks框架检查参数的内容?
我试图用框架测试一个类,该类创建简单的值对象并将它们传递给协作者。如何检查这些对象的内容 代码的总体思路如下:如何使用Delphi Mocks框架检查参数的内容?,delphi,delphi-xe2,delphi-mocks,Delphi,Delphi Xe2,Delphi Mocks,我试图用框架测试一个类,该类创建简单的值对象并将它们传递给协作者。如何检查这些对象的内容 代码的总体思路如下: TData = class Code : string; Field1 : string; Field2 : string; end; IReceiver = interface procedure Process(aData : TData); end; TSUTClass = class public procedure DoSomething(const
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;
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;
因此,当调用DoSomething
时,TSUTClass
应该创建几个TData
的实例,并将它们逐个传递给接收方。过程
。我可以验证使用此设置进行的呼叫计数是否正确:
Mock := TMock<IReceiver>;
Mock.Setup.Expect.Exactly('Process', ExpectedCount);
Mock:=TMock;
Mock.Setup.Expect.justice('Process',ExpectedCount);
但是如何检查
Field1
和Field2
的值是否正确?模拟有一个WillExecute
方法,您可以在其中传递一个匿名方法,该方法将在调用模拟时执行。您可以计算传递的TData
对象。不幸的是,快速查看之后,您似乎无法将WillExecute
与预期的调用计数结合起来
DSharp mock与Delphi mock非常相似,其外观如下:
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;
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;
var
模拟:模拟;
sut:TSUTClass;
callCount:整数;
开始
sut:=TSUTClass.Create(mock);
呼叫计数:=0;
mock.Setup.WillExecute(
函数(常量参数:TArray;常量返回类型:TRttiType):TValue
变量
数据:TData;
开始
公司(电话号码);;
数据:=args[0]。aType;
案例调用计数
1:
开始
CheckEquals('xyz',data.Field1);
CheckEquals('abc',data.Field2);
结束;
2: ///...
结束;
结束)。当使用任何参数调用时,正好是(2)。进程(nil);
sut.DoSomething('x');
结束;
至少在Delphi mock中,args[0]
是Self
,IReceiver的一个实例,args[1]
是TData
。我知道,但在DSharp mock中,这并不是因为我发现将自指针指向一个模拟实例毫无价值,因为它是无状态的,不是一个IExpect-哦,我做不到。正是(2)像示例中那样。