如何使用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)像示例中那样。