2

XCTest を作成し、Typhoon でモックされた依存関係を注入しようとしています。

これが私のコードですViewController

   - (instancetype)init {
    self = [super init];

    MDMainAssembly *assembly = (MDMainAssembly *) [TyphoonComponentFactory defaultFactory];
    self.alertManager = [assembly alertManager];

    return self;
   }

インジェクションを変更しようとしている方法は次のとおりです。

    self.mockedAlertManager = mock([MDAlertManager class]);

    MDMainAssembly *assembly = [MDMainAssembly assembly];
    TyphoonComponentFactory *factory = [TyphoonBlockComponentFactory factoryWithAssembly:assembly];
    TyphoonPatcher *patcher = [[TyphoonPatcher alloc] init];
    [patcher patchDefinition:[assembly alertManager] withObject:^id {
        return self.mockedAlertManager;
    }];

    [factory attachPostProcessor:patcher];

ただし、このファクトリをデフォルトとして設定できないため、テストは失敗しています。私はAppDelegate工場で設定します:

    TyphoonComponentFactory *factory = [[TyphoonBlockComponentFactory alloc] initWithAssemblies:@[
        [MDMainAssembly assembly],
    ]];
    [factory makeDefault];

この状況から抜け出すには?

4

1 に答える 1

2

限られたケースのために defaultFactory 機能を作成しました。主なものは次のとおりです。

  • Typhoon へのアクセスを取得し、Typhoon によって管理されていないクラスの依存関係を検索します。通常、これは必須ではありません。

テストで使用することもできますが、テストの実行ごとに Typhoon コンテナーを作成して破棄することをお勧めします。重複を避けるために、次のようにメソッドを作成できます。

@implementation IntegrationTestUtils

+ (TyphoonComponentFactory*)testAssembly
{
    TyphoonComponentFactory* factory = [[TyphoonBlockComponentFactory alloc] initWithAssemblies:@[
        [MyAppAssembly assembly],
        [MyAppKernel assembly],
        [MyAppNetworkComponents assembly],
        [MyAppPersistenceComponents assembly]
    ]];

    id <TyphoonResource> configurationProperties = [TyphoonBundleResource withName:@"Configuration.properties"];
    [factory attachPostProcessor:[TyphoonPropertyPlaceholderConfigurer configurerWithResource:configurationProperties]];

    return factory;
}

. . 必要に応じて、パッチャーをこのアセンブリにアタッチできます。

デフォルトのファクトリにパッチャーをアタッチする:

既定のアセンブリにパッチャーを適用する場合は、おそらく再度パッチを解除することをお勧めします。この機能は、こちらのバックログにあります。

于 2014-02-20T12:18:53.360 に答える