2

単体テストできるように、既存のコードを分離しようとしています。UI オブジェクトへの依存を削除するためのインターフェイスを導入しました。問題は、Spring コンテナーの RegisterComponent < T > 呼び出しに TComponentType パラメーターが必要であるため、RegisterComponent< IMyProgressBar > を呼び出すことができないことです。RegisterType < TMyProgressBar >.Implements < IMyProgressBar > を呼び出す必要があります。つまり、DUnit でプログレスバー クラス定義を含むユニットを使用する必要があります。これは、DIContainer を ServiceLocater と連携して使用して、必要なときにプログレスバーを要求するという目的を無効にします。

モック クラスを作成してインターフェイスを手動で実装する必要はありません。Delphi.Mocks を使用して、実装クラスを指定せずにインターフェイスを自動的にモックする方法はありますか?

4

1 に答える 1

3

この機能は昨年 11 月に実装されたため、Spring4D の最新バージョンを使用していないようです ( https://stackoverflow.com/a/11315141/587106の更新を参照) 。

現在、コンテナーの自動モックはありませんが、私はこのアイデアが好きで、これを簡単にする何かを実装することを検討します (おそらくコンテナー拡張機能を改善することによって)。

現時点では、テスト ケース メソッドは次のようになります (DSharp モック構文を使用)。

procedure TMyTestCase.TestSomething;
var
  progressBarMock: Mock<IProgressBar>;
  sut: TTestComponent;
begin
  container.RegisterType<TTestComponent>;
  container.RegisterType<IProgressBar>.DelegateTo(
    function: IProgressBar
    begin
      Result := progressBarMock;
    end);
  container.Build;

  // mock setup

  sut := container.Resolve<TTestComponent>;

  // perform test
end;

とにかく、DI コンテナーを使用せずに単体テストを作成することを強くお勧めします。

SUT に多くの依存関係があり、コンテナーの使用が魅力的である場合、それは多くの場合、特定の設計原則に違反している兆候です。

于 2013-04-18T11:28:20.733 に答える