Delphi Mocks
v0.3.1
Delphi Mocks是Delphi XE2或更高版本的简单模拟框架。它利用仅在Delphi XE2中可用的RTTI功能。请参阅空间底部的示例以进行完整的解释。
为了匹配期望或行为,有扩展的参数匹配。
function IsAny <T>() : T ;
function Matches <T>( const predicate: TPredicate<T>) : T;
function IsNotNil <T> : T; overload;
function IsNotNil <T>( const comparer: IEqualityComparer<T>) : T; overload;
function IsEqualTo <T>( const value : T) : T; overload;
function IsEqualTo <T>( const value : T; const comparer: IEqualityComparer<T>) : T; overload;
function IsInRange <T>( const fromValue : T; const toValue : T) : T;
function IsIn <T>( const values : TArray<T>) : T; overload;
function IsIn <T>( const values : TArray<T>; const comparer: IEqualityComparer<T>) : T; overload;
function IsIn <T>( const values : IEnumerable<T>) : T; overload;
function IsIn <T>( const values : IEnumerable<T>; const comparer: IEqualityComparer<T>) : T; overload;
function IsNotIn <T>( const values : TArray<T>) : T; overload;
function IsNotIn <T>( const values : TArray<T>; const comparer: IEqualityComparer<T>) : T; overload;
function IsNotIn <T>( const values : IEnumerable<T>) : T; overload;
function IsNotIn <T>( const values : IEnumerable<T>; const comparer: IEqualityComparer<T>) : T; overload;
function IsRegex ( const regex : string; const options : TRegExOptions = []) : string;
function AreSamePropertiesThat <T>( const Value : T): T;
function AreSameFieldsThat <T>( const Value : T): T;
function AreSameFieldsAndPropertiedThat <T>( const Value : T): T;用法很容易:
mock.Setup.Expect.Once.When.SimpleMethod(It0.IsAny<Integer>, It1.IsAny<String>);
mock.Setup.WillReturn( 3 ).When.SimpleFunction(It0.IsEqualTo<String>( ' hello ' ));应该为匹配课程提供更多的关注。 .IsAny<TMyClass>的使用将无法预期,因为nil (这是IsAny<T>的默认返回值)始终是一个很好的匹配。因此,以下设置将在第二行失败,因为该框架将认为已经定义了行为(在第一行中)。
mock.Setup.Expect.Never.When.ExtendedMethod(It0.IsAny<TMyClass>);
mock.Setup.Expect.Never.When.ExtendedMethod(It0.IsAny<TMyOtherClass>);可以通过使用.IsNotNil<TMyClass>可以轻松解决这:
mock.Setup.Expect.Never.When.ExtendedMethod(It0.IsNotNil<TMyClass>);
mock.Setup.Expect.Never.When.ExtendedMethod(It0.IsNotNil<TMyOtherClass>); unit Delphi.Mocks.Examples.Interfaces;
interface
uses
SysUtils,
DUnitX.TestFramework,
Delphi.Mocks;
type
{ $M+ }
TSimpleInterface = Interface
[ ' {4131D033-2D80-42B8-AAA1-3C2DF0AC3BBD} ' ]
procedure SimpleMethod ;
end ;
TSystemUnderTestInf = Interface
[ ' {5E21CA8E-A4BB-4512-BCD4-22D7F10C5A0B} ' ]
procedure CallsSimpleInterfaceMethod ;
end ;
{ $M- }
TSystemUnderTest = class (TInterfacedObject, TSystemUnderTestInf)
private
FInternalInf : TSimpleInterface;
public
constructor Create( const ARequiredInf: TSimpleInterface);
procedure CallsSimpleInterfaceMethod ;
end ;
TMockObjectTests = class
published
procedure Simple_Interface_Mock ;
end ;
implementation
uses
System.Rtti;
{ TMockObjectTests }
procedure TMockObjectTests.Simple_Interface_Mock ;
var
mock : TMock<TSimpleInterface>;
sutObject : TSystemUnderTestInf;
begin
// SETUP: Create a mock of the interface that is required by our system under test object.
mock := TMock<TSimpleInterface>.Create;
// SETUP: Add a check that SimpleMethod is called atleast once.
mock.Setup.Expect.AtLeastOnce.When.SimpleMethod;
// SETUP: Create the system under test object passing an instance of the mock interface it requires.
sutObject := TSystemUnderTest.Create(mock.Instance);
// TEST: Call CallsSimpleInterfaceMethod on the system under test.
sutObject.CallsSimpleInterfaceMethod;
// VERIFY: That our passed in interface was called at least once when CallsSimpleInterfaceMethod was called.
mock.Verify( ' CallsSimpleInterfaceMethod should call SimpleMethod ' );
end ;
{ TSystemUnderTest }
procedure TSystemUnderTest.CallsSimpleInterfaceMethod ;
begin
FInternalInf.SimpleMethod;
end ;
constructor TSystemUnderTest.Create( const ARequiredInf: TSimpleInterface);
begin
FInternalInf := ARequiredInf;
end ;
end .