単体テストで使用するインターフェイス IClient をサポートするオブジェクトをモックしています。
インターフェイス自体は、別のユニット ClientIF で定義されます。
インターフェイスは、別のユニット ldetail で定義された TDetail を参照します。
TDetail をモックすると、TDetail を使用するすべての関数で不明なエラーが発生します。
[DCC Error] MockClient.pas(16): E2003 Undeclared identifier: 'GetDetailValue'
[DCC Error] MockClient.pas(16): E2003 Undeclared identifier: 'GetDetail'
[DCC Error] MockClient.pas(16): E2003 Undeclared identifier: 'GetActiveDetail'
[DCC Fatal Error] EmailPdfPropertiesGeneratorTests.pas(25): F2063 Could not compile used unit 'MockClient.pas'
作業中のユニット/インターフェースだけをテストするには、インターフェースとサポートされている詳細オブジェクトの両方をモックできる必要があります。そうしないと、テストの悪夢となるバックエンド データにすべて関連付けられます。
関連する MockClient.pas ユニット コード
uses ClientIF, MockDetail;
TMockClient = class(TInterfacedObject, IClient)
FDetail: TDetail;
function GetDetailValue: TDetail;
function GetDetail: TDetail;
function GetActiveDetail: TDetail;
function GetDetailName: String;
end;
関連する ClientIF.pas インターフェイス コード
uses Classes, TaxConst, OSIConst, ldetail, clNotesIF, MissingDataDefIF,
ClientDataChangeEventIF;
type
IClient = interface
['{CFED9A10-1601-11D4-ACF6-005004889419}']
function GetDetailValue: TDetail;
function GetDetail: TDetail;
function GetActiveDetail: TDetail;
function GetDetailName: String;
end;
関連する MockDetail.pas コード
uses Classes;
type
TCodeValuesRec = class
private
fAmount: double;
fDesc: String;
fStateID: integer;
fCityID: String;
fSuffixCount: integer;
public
property Amount: double read fAmount write fAmount;
property Desc: String read fDesc write fDesc;
property StateID: integer read fStateID write fStateID;
property CityID: String read fCityID write fCityID;
property SuffixCount: integer read fSuffixCount write fSuffixCount;
end;
TDetail = class
private
FSeries: Integer;
FProp: Integer;
FPropCount: Integer;
FCodeValuesRec: TCodeValuesRec;
public
property Series: Integer read FSeries write FSeries;
property Prop: Integer read FProp write FProp;
property PropCount: Integer read FPropCount write FPropCount;
function GetCodeValuesRecord(WhichRecord: Integer):TCodeValuesRec;
constructor Create;
destructor Destroy; override;
end;
MockClient uses 句で MockDetail を ldetail に置き換えると、コンパイルされますが、もちろん、詳細は、テスト対象のコードからの呼び出しの 1 つであるため、モックする必要があるものの 1 つです。
レガシ コードをテスト対象にしようとしていますが、これはプロセスです。この問題が発生しているコードは実際には新しいコードですが、最初はテスト用に古いオブジェクトが必要でした。
この質問の目標は、新しいコードをテスト対象にすることです。そのため、古いインターフェイス (古いクラスを含む) のモックを作成して、MyClient.GetDetail が、オブジェクトで使用できる情報が入力されたモック TDetail を返すようにします。テスト中。古いコードをリファクタリングせずに偽造する方法がない場合、プロセスは待機する必要があります。
偽の Client と Detail に偽の作業を実行させ、テスト フレームワーク (DUnit) にコンパイルして、実際の (新しい) コードに対してテストを実行できるようにできれば、それで十分です。
現在、Delphi 2010 (今年アップグレード) を使用しており、最終的には XE に移行する予定ですが、Mock Framework は XE2 でのみ動作するように見えるため、まだ使用できません。