如何使用Delphi Mocks Framework检查参数内容?

时间:2014-05-10 00:48:45

标签: delphi delphi-xe2 delphi-mocks

我试图用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);

但是如何检查Field1Field2的值是否正确?

1 个答案:

答案 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;