2016-04-24 5 views
0

台風やストーリーボードを使用しているときに、View Controllerの依存関係を模擬しようとしています。依存関係にパッチを当てようとすると、パッチを模倣しても影響がないようです。Typhoonを使用しているときにテストからのストーリーボードビューコントローラの依存関係を模擬する方法は?

誰でも助けてください。

は、ここに私の台風アセンブリです:

#import "ANYApplicationAssembly.h" 
#import "ANYDatabase.h" 
#import "ANYTableViewController.h" 

@implementation ANYApplicationAssembly 

- (ANYTableViewController *)tableViewController { 
    return [TyphoonDefinition withClass:[ANYTableViewController class] configuration:^(TyphoonDefinition *definition) { 
     [definition injectProperty:@selector(database) with:[self theDatabase]]; 
    }]; 
} 

- (ANYDatabase *)theDatabase { 
    return [TyphoonDefinition withClass:[ANYDatabase class]]; 
} 

@end 

そして、ここでのテストです:

#import <OCMock/OCMock.h> 
#import <UIKit/UIKit.h> 
#import <XCTest/XCTest.h> 
#import "ANYTableViewController.h" 
#import "ANYApplicationAssembly.h" 
#import "ANYDatabase.h" 

@interface ANYTableViewControllerTests : XCTestCase 

@end 

@implementation ANYTableViewControllerTests 

ANYTableViewController* controller; 
ANYDatabase* mockDatabase; 

- (void)setUp { 
    [super setUp]; 

    mockDatabase = OCMClassMock([ANYDatabase class]); 

    ANYApplicationAssembly* assembly = [[ANYApplicationAssembly assembly] activate]; 
    TyphoonPatcher* patcher = [[TyphoonPatcher alloc] init]; 
    [patcher patchDefinitionWithSelector:@selector(theDatabase) withObject:^id{ 
     return mockDatabase; 
    }]; 
    [assembly attachDefinitionPostProcessor:patcher]; 
    [assembly makeDefault]; 

    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 
    controller = [storyboard instantiateViewControllerWithIdentifier:@"TableController"]; 
    [controller loadViewIfNeeded]; // force IBOutlets etc to be initialized 
    XCTAssertNotNil(controller.view); 
} 

- (void)testShowsAllTheThings { 
    // Given 
    NSArray* allTheThings = @[@"all", @"the", @"things"]; 
    OCMStub([mockDatabase things]).andReturn(allTheThings); 

    // When 
    NSInteger sections = [controller numberOfSectionsInTableView:controller.tableView]; 
    NSInteger rows = [controller tableView:controller.tableView numberOfRowsInSection:0]; 

    // Then 
    XCTAssertEqual(sections, 1); 
    XCTAssertEqual(rows, 2); 
} 

@end 

それが台風を使用した場合、ストーリーボードによってロードされたビューコントローラの依存関係を模擬することは可能ですか?

答えて

0

ので、もう少し調査した後、私は解決策を見つけたが、initialFactory方法を実現AppDelegate IntegrationPList Integrationを使用してから切り替えるために持っていた:

AppDelegate.h:

- (id)initialFactory; 

AppDelegate.m :

- (id)initialFactory { 
    TyphoonComponentFactory *factory = ([[TyphoonBlockComponentFactory alloc] initWithAssembly:[ANYApplicationAssembly assembly]]); 
    [factory makeDefault]; 
    return factory; 
} 

ANYTableViewControllerTests.m:

- (void)setUp { 
    [super setUp]; 

    mockDatabase = OCMClassMock([ANYDatabase class]); 

    ANYApplicationAssembly* assembly = (ANYApplicationAssembly*) [TyphoonComponentFactory defaultFactory]; 
    TyphoonPatcher* patcher = [[TyphoonPatcher alloc] init]; 
    [patcher patchDefinitionWithSelector:@selector(theDatabase) withObject:^id{ 
     return mockDatabase; 
    }]; 
    [assembly attachDefinitionPostProcessor:patcher]; 

    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 
    controller = [storyboard instantiateViewControllerWithIdentifier:@"TableController"]; 
    [controller loadViewIfNeeded]; // force IBOutlets etc to be initialized 
    XCTAssertNotNil(controller.view); 
} 

PListの統合を使用してこれを動作させる方法があれば、私は興味があります。なぜPListの統合を使用しても動作しないのですか?

関連する問題