2016-12-17 4 views
2

私は、VIPERアーキテクチャのプロトコルの利点と少し混乱しています。 私はDI(Dependency Injection)がプロトコルを介して達成され、オブジェクト間の直接の依存を避けることを理解します。ユニットテストにおけるプロトコルヘルプ給付(タラクター部分をテストする)は、特にどのように -IOS VIPER:プロトコルがユニットテストでどのように役立つのですか?

しかし、私は、使用の観点から、本当の利点で探していますが、一例であってもよいです。

ブロックを使用して同じコールバックメソッドをコールバックできませんか? ホープ誰かが私にはあなたのVIPER構造で実装をスワップアウトすることが容易になり、プロトコルを使用することにより、いくつかの例を挙げての使用の観点から

乾杯

答えて

3

コールバックを使用します。インタラクタからプレゼンタまで、プレゼンタをテストするのが難しくなります。

プレゼンターが入力(Interactorから送信されたもの)を処理する方法をテストする際には、プレゼンターがインタラクターに電話をかけるメソッドが呼び出されなければなりません。データをプレゼンターに送信します。

プレゼンターは、インターアクターによって定義されたプロトコルを実装したことで、あなたのテストはちょうど直接プレゼンターに適切な入力メソッドを呼び出すことができます。

は限りプロトコルを宣言するように、私はモックの役割ではなく、オブジェクト(http://www.jmock.org/oopsla2004.pdf)のスタイルでTDDを実践します。プロトコルは、オブジェクトの役割(その役割)に焦点を当てることにより、より良い抽象化を提供するのではなく、その役割をどのようにするかを支援します。

プロトコルは、単体テストではそれほど価値がありません。ユニットテストでは、テスト対象システムの依存関係のテストダブル(http://martinfowler.com/bliki/TestDouble.html)が提供されます。依存関係を具象クラスとして公開しても、テスト用のテストダブルを作成できます。

Objective-Cでは、OCMock(http://ocmock.org)、OCMockito(https://github.com/jonreid/OCMockito)などのモッキングライブラリを使用して、具象クラスのスタブ、スパイ、またはモックを作成できます。

Swiftでは、依存関係として使用されている具体的なクラスをそれぞれサブクラス化することで、テストダブルを作成できます。要するに

、プロトコルは、ユニットテストを容易にするために使用されていないが、アプリケーションが何をするか、抽象度の高い記述します。ここ

は事後有益であった抽象プロトコルを有する方法の例である:

Iは、例えば、ユーザが画面上で実行できるアクションを表すためのプロトコルを作成しましたProfileUserActionsなどのアクションがあり、changeNamechangeAddressなどのアクションがありました。プレゼンターはProfileUserActionsを実装し、ビューはProfileUserActionsを依存として受け入れました。ユーザーが画面上のボタンをタップすると、ビューは適切なメッセージをuserActionsオブジェクトに送信します。

アナリティクスを追加したいときは、ProfileUserActionsも実装した新しい独立したProfileAnalyticsクラスを作成することができました。ビューとプレゼンターの間にアナリティクスオブジェクトを挿入しました。ビューやプレゼンターのいずれかを変更することなく、アナリティクスをキャプチャできるようになりました。

+0

詳細な返信をありがとうございます。私はプロトコルの目的をクリアしました。私はUNITテストとまだ少し混乱しています:)それについては申し訳ありません。サンプルコードは私に良い画像を与えることができるかもしれない – MaK

+0

Gotcha!ごめんなさい:-)あなたのユニットテストはいつ書くのですか?あなたがコードを書く前に、例えば。 TDD?またはコードが書かれた後? –

+0

実際、私はバイパーモデルで構築された既存のコードベースのユニットテストを書く必要があります - BDDを使う計画。そして、私は実際にTDD対BDDにもう1つの質問を投稿しました:) http://stackoverflow.com/questions/41264111/tdd-vs-bdd-rest-service – MaK

0

を理解するのに役立ちます。たとえば、ファイルシステムに書き込んでいるクラスで作業しているインタラクタがあるとします。単体テストでファイルシステムをテストするのではなく、ファイルシステムの書き込み操作をプロトコルの背後にあるインタラクタに置くと、ファイルシステムの書き込み操作をメモリ内の実装に置き換えることができます。

は、相互作用物質自体のプロトコルについては、私はそれがもう少し実用的なあなたの選択についてであることを支払っていると思います。インタラクターをテスト用に構築するのが簡単で、テストの一部として副作用が発生しない場合は、おそらくプロトコルが不要です。一方、他の多くの依存関係を作成する必要がある場合は、インタラクタがプロトコルに準拠するようにして、インタラクタから取得した出力をより簡単に偽造することができます。

関連する問題