2

タイトルが示すように、メソッドの 1 つのバージョンが呼び出され、オーバーロードされたバージョンが呼び出されないことを確認するテストを作成しようとしています。Delphi-Mocks はパラメータ マッチングでインデックスを使用しているように見えるため、エラーが表示され、オーバーロードされた関数が実際には呼び出されていません。

サンプル テスト インターフェイス

TFoo = class(TObject)
public 
    function Bar(const a, b, c: string) : string; overload;virtual;
    function Bar(const a: string) : string; overload;virtual;
end;

サンプル テスト コード

procedure TestClass.Test
var mock : TMock<TFoo>;
    bar : TBar;
begin
    mock := TMock<TFoo>.Create;
    bar := TBar.Create(mock);
    mock.Setup.Expect.Once.When.Bar('1','2','3');
    mock.Setup.Expect.Never.When.Bar(It(0).IsAny<string>());        

    //Will Wind up down an if-branch calling either bar(1) or bar(3)
    bar.Execute; 

    mock.VerifyAll;        
end;

ありがとう!

4

2 に答える 2

2

Spring Mocks (今後の 1.2 リリースの一部) の FWIW では、同じテストは次のようになります。

procedure TestClass.Test;
var
  mock: Mock<TFoo>;
  bar: TBar;
begin
  foo := TBar.Create(mock);

  bar.Execute; 

  mock.Received(1).Bar('1', '2', '3');
  mock.Received(0).Bar(Arg.IsAny<string>);
end;

お気づきのように、コンセプトは少し異なります。モック ビヘイビア ダイナミック (デフォルト) で実行している場合、モックへのすべての呼び出しが許可され、関数のデフォルト (空の文字列、0 または nil など) が返されます。その後、Received を使用して、メソッドが予想される回数呼び出されたかどうかを確認できます。

于 2016-04-06T10:01:33.147 に答える
1

これを確認するには、「WillExecute」を使用できます。例えば:

procedure TestClass.Test;
var
  mock : TMock<TFoo>;
  bar : TBar;
  CheckPassed: Boolean;
begin
  mock := TMock<TFoo>.Create;
  bar := TBar.Create(mock);

  CheckPassed := True;
  mock.Setup.WillExecute('Bar',
    function(const Args: TArray<TValue>; const ReturnType: TRttiType): TValue
    begin
      if Length(Args) = 2 then // one is for "Self"
        CheckPassed := False;
    end);

  //Will Wind up down an if-branch calling either bar(1) or bar(3)
  bar.Execute;

  Assert(CheckPassed);
end;
于 2016-04-06T06:30:10.727 に答える