2

我正在尝试使用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;

因此,当调用 to 时DoSomethingTSUTClass应该创建几个实例TData并将它们一一传递给Receiver.Process. 我可以验证是否使用此设置进行了正确的调用计数:

Mock := TMock<IReceiver>;
Mock.Setup.Expect.Exactly('Process', ExpectedCount);

但是如何检查Field1和的值Field2是否正确?

4

1 回答 1

3

模拟有一个WillExecute方法,您可以在其中传递一个匿名方法,该方法将在模拟被调用时执行。您可以评估传递的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;
于 2014-05-10T09:36:23.010 回答