2014-05-10 5 views
2

간단한 값 개체를 만들고 공동 작업자에게 전달하는 클래스 인 Delphi Mocks 프레임 워크로 테스트하려고합니다. 이 객체의 내용을 확인하는 방법은 무엇입니까? 코드의Delphi Mock Framework를 사용하여 매개 변수의 내용을 확인하는 방법은 무엇입니까?

일반 아이디어는 다음과 같이이다 : DoSomething에 대한 호출이 될 때

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; 

그래서, TSUTClassTData의 여러 인스턴스를 만들고 Receiver.Process에 하나씩 전달해야합니다. Field1Field2의 값이 올바른지

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

하지만 어떻게 확인하기 : 나는 전화의 정확한 개수가이 설정으로 만들어 확인할 수 있습니까?

답변

3

mock에는 WillExecute 메서드가 있습니다. 모의 메서드가 호출 될 때 실행되는 익명 메서드를 전달할 수 있습니다. 전달 된 TData 개체를 평가할 수 있습니다. 불행히도 빠른 모양 후에는 WillExecute과 예상 통화 횟수를 결합 할 수없는 것으로 보입니다.

델파이 그것과 같을 것이다 모의 객체와 매우 유사하다 DSharp 모의 객체와

- IReceiver``인스턴스 -

적어도 델파이 모의 객체에
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; 
+0

'인수 [0] ''Self'이고 'args [1]'은'TData'입니다. – Teloah

+0

나는 DSharp를 모의합니다. 왜냐하면 stateless이기 때문에 모의 인스턴스에 대한 Self 포인터를 갖는 것이 무의미하다는 것을 알았 기 때문이 아닙니다. –

+0

WillExecute는 I를 반환하는 것처럼 보입니다. IExpect가 아닌 IOW, 할 수 없습니다. 예 (2)와 같습니다. –

관련 문제