3

いくつかの可能な実装オブジェクトの 1 つを作成し、それをインターフェイス参照として返す単純なファクトリ クラスの単体テストを作成しようとしています。

DUnit には組み込みプロシージャ がありCheckIs(AObject: TObject; AClass: TClass; msg: string)、オブジェクトのクラス タイプが期待されるものと一致しない場合、その名前と受け入れるパラメータに基づいてテストに失敗する必要があります。唯一の問題は、インターフェイス参照ではなくオブジェクト参照が必要なことです。

そのため、テストの本体で比較を使用して実行しようとしてCheckTrueいますが、C# の場合ほど Delphi の型チェック サポートには慣れていません。

isオブジェクト参照でのみ機能するため、演算子が問題外であることはわかっています。

CheckTrue(LMyInterfaceReference {comparison here} TMyClass);

助言がありますか?

ところで、私は Delphi 2009 を使用しているため、2010 年以降に追加された新しい RTTI サポートにアクセスできません。

4

3 に答える 3

4

ハッキングが気に入らず、Delphi 2010+にアップグレードしたくない場合は、次のようなインターフェイスを使用できます。

IImplementingObjectInterface = interface
  function GetImplementingObject: TObject;
end;

オブジェクトにもこのインターフェイスが実装されていることを確認し、それを使用して実装オブジェクトを抽出します。多くのオブジェクトに対してこれを行う必要がある場合はTInterfacedObject、すでにこれを実装している独自の派生物を定義できるため、継承を変更するだけで完了できます。

于 2011-03-04T17:04:10.153 に答える
4

なぜこれをテストする必要があるのか​​ 疑問に思っています...おそらく、本当にテストする必要はありません。

ただし、インターフェイスの基になるオブジェクトを知る必要がある場合は、次の 2 つの選択肢があります。

  • 基になるオブジェクト (TObject のみ) を返すメソッドをインターフェイスに追加し、self を返すだけでこれを各クラスに実装します。
  • たとえば、このInterface to objectルーチンを使用して、少しハックします。
于 2011-03-04T16:55:59.210 に答える
1

Barry Kelly (主要な Embarcadero Delphi コンパイラ エンジニアの 1 人) は、今週、オブジェクト キャストへのインターフェイスの醜い代替案を書きました。

それはあなたの質問に答えます。

興味深いのは、Hallvard Vassbotnが2004 年に非常によく似たコードを書いたことです。

Delphi 2010 以降では、isチェックまたはasキャストを使用してインターフェイス参照からオブジェクト参照に戻ることができます。

--jeroen

于 2011-03-04T21:48:07.873 に答える