2

私がユニット テストを行っているクラスは、DB テーブルの各レコードをスクロールし、フィールドの値を前の値に合計します。以下は、骨に縮小されたクラスです。

procedure TSumList.Sum;
var
  FSum:integer;
begin
  FSum:=0;
  FDB.First;
  while not FDB.EOF do
  begin
    FSum:=FSum+FDB.GetAmount;
    FDB.Next;
  end;
end;

FDB は、IIDBTable という名前の DB モック インターフェイスを指します。

以下は、依存性注入の DB モックです。

  IIDBTable = interface
    ['{A299D1D6-93AF-45CC-8DE2-9A4EE188C352}']
    procedure First;
    procedure Next;
    function EOF : boolean;
    function GetAmount:integer;
  end;

  TMockDBTable = class (TInterfacedObject,IDBTable)
    procedure First;
    procedure Next;
    function EOF : boolean;
    function GetAmount:integer;
  end;

問題は、テスト用のモックにデータを提供する方法がわからないことです。もちろん、AddValues(aAmount:integer) などの追加の手順を追加することもできます。

これのベストプラクティスは何ですか?

Spring for Delphi フレームワークを使用しています

4

2 に答える 2

4

DSharp モック (または Delphi モック) を使用することもできます。

これは DSharp のセットアップ コードになります (Delphi Mocks も同様です)。

var
  mockDBTable: Mock<IIDBTable>;
begin
  mockDBTable.Setup.WillExecute.Once.WhenCalling.First;
  mockDBTable.Setup.WillReturn(False).Exactly(5).WhenCalling.EOF;
  mockDBTable.Setup.WillReturn(True).Once.WhenCalling.EOF;
  mockDBTable.Setup.WillReturn(5).Once.WhenCalling.GetAmount;
  mockDBTable.Setup.WillReturn(4).Once.WhenCalling.GetAmount;
  mockDBTable.Setup.WillReturn(3).Once.WhenCalling.GetAmount;
  mockDBTable.Setup.WillReturn(2).Once.WhenCalling.GetAmount;
  mockDBTable.Setup.WillReturn(1).Once.WhenCalling.GetAmount;
  mockDBTable.Setup.WillExecute.Exactly(5).WhenCalling.Next;

ここで行うことは、呼び出されると予想されるものと返されるものを指定することです。これにより、手動でモック クラスを作成してデータをフィードする必要がなくなります。

于 2014-02-04T07:53:43.323 に答える
2

モック クラスに追加のメソッドを追加しAddValuesます。実際のクラスではなく、そのモッククラスにのみ存在するため、余分なコードが本番環境に表示されるという異議は根拠がありません。

インターフェイスを介して排他的にモックオブジェクトを扱っているため、コードを本番環境に置く必要があると考えていたのではないでしょうか。余分なメソッドはインターフェイスに存在するため、クラスの製品バージョンに属していなくても、クラスの製品バージョンに実装する必要があります。

代わりに、 をインスタンス化しTMockDBTable、オブジェクト参照を介してアクセスして設定しますが、テストには必要です。準備ができたら、インターフェイス経由で使用するように切り替えますIIDBTable

もう 1 つのオプションは、コンストラクターに追加するパラメーターを介してクラスにデータをフィードすることです。そうすれば、追加のメソッドも必要ないので、インターフェイスやプロダクション クラスでそのメソッドを定義しようという誘惑にかられることはありません。クラスはまったく関連していないため、モッククラスのコンストラクターがプロダクションクラスのコンストラクターのように見える必要がある理由はありません。コンストラクターは、インターフェイス定義の一部ではありません。

于 2014-02-03T22:32:31.167 に答える