1

iOS で UI テストを実行するときにアセンブリを交換またはパッチすることは可能ですか? 現在、私は Typhoon フレームワークをセットアップしたプロジェクトを持っており、このようなアセンブリにパッチを当てることができます

var controller: HomeViewController!

override func setUp() {
    super.setUp()
    // setup assemblies
    var blAssembly = BusinessLogicAssembly()
    var ctrlAssembly = AppAssembly()

    // setup patcher
    let patcher = TyphoonPatcher()
    patcher.patchDefinitionWithSelector("testManager", withObject: {return FakeManager()})

    patcher.patchDefinition(blAssembly.testManager() as TyphoonDefinition, withObject: {
        return FakeManager()})


    let factory = TyphoonBlockComponentFactory(assemblies: [blAssembly, ctrlAssembly])
    factory.attachPostProcessor(patcher)


    // get controller
    controller = factory.componentForKey("homeViewController") as HomeViewController

    // force view to laod
    let vcView = controller.view
}

そして、これはうまく機能しています。TestManagerにスタブをパッチします。ただし、この場合、View Controller を手動で呼び出しています。UI テスト (アプリの起動時にコントローラーがバックグラウンドで処理される) を実行するときに、アセンブリにパッチを適用してモック/スタブを提供する方法はありますか?

たとえば、Web サービスを呼び出すビュー コントローラーがあるとします。Web サービス ロジックは別のクラスにラップされ、TyphoonAssembly. UI テストでは、実際の Web サービスにアクセスするのではなく、サンプル データを証明しただけです。Web サービス クラスのスタブを作成し、テスト データを返すことで、これを行うことを想像しています。私はそれを行うことができなかったか、どこにも例を見つけることができなかったため、台風フレームワークでこれを達成できますか。

私はSwiftを使用していますが、Objective-Cの回答も機能します(互換性がある限り)

4

1 に答える 1

2

Typhoon では、あるコンポーネントを別のコンポーネントに交換する方法がいくつかあります。TyphoonPatcherを使用するか、アセンブリをモジュール化することができます。または、カスタムのTyphoonDefinitionPostProcessorまたは TyphoonInstancePostProcessorを作成することもできます。

問題/解決策:

しかし、私があなたの質問を正しく理解していれば、問題はアプリケーション スタイル (デフォルト) の種類のテストが使用されていることです。

  • TEST_HOST フラグが設定されます。アプリケーション クラスはテストに表示されます。
  • 統合テストは、アプリケーション アセンブリを使用するのではなく、独自のアセンブリをインスタンス化します。通常はこれが推奨されますが、これはメイン アプリで使用されるものとは別の追加のアセンブリであることに注意することが重要です。

テストからメイン アプリのアセンブリを変更する場合は、defaultFactory. plist 統合を使用している場合:

アプリ デリゲートの定義を作成します。

 dynamic func appDelegate() -> AnyObject {
    return TyphoonDefinition.withClass(AppDelegate.self) {
        (definition) in

        //This is a public instance var of type TyphoonComponentFactory
        definition.injectProperty("assembly", with: self)
    }
}    

. . 次に、AppDelegate で:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    factory.makeDefault()

}

. . . テストまたは必要な場所で、フックを取得してアプリのアセンブリにパッチを適用します。

TyphoonComponentFactory *factory = [TyphoonComponentFactory defaultFactory];
[factory unload]; //clear out any singletons
//Now patch it
  • factory.unload()事前にインスタンスをクリアするために呼び出す必要がある場合があることに注意してくださいTyphoonScopeSingleton
  • また、必要に応じて TyphoonPatcher を使用すると、パッチを解除したり巻き戻したりすることもできます。

別:

別の方法として、単純に (可能な限り単純にすることをお勧めします)、アプリケーション plist で別のアセンブリ セットを指定する別のネットワーク アセンブリを使用してアプリを起動することもできます。



*NB: Objective-C では、任意TyphoonComponentFactoryのものをアセンブリにキャストでき、その逆も可能です。これは Swift では許可されていないため、不便な制限が生じる可能性があります。#253で対処する

于 2015-01-05T23:27:46.600 に答える