2016-04-24 7 views
0

Ich habe Schwierigkeiten, eine View-Controller-Abhängigkeit zu verspotten, wenn ich Typhoon und Storyboards verwende. Wenn ich versuche, die Abhängigkeit zu patchen, die ich verspotten möchte, scheint der Patch keine Auswirkungen zu haben.Wie können Storyboard-Controller-Abhängigkeiten von Tests bei der Verwendung von Typhoon simuliert werden?

Bitte kann jemand helfen?

Hier ist meine Taifun Montag:

#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 

Und hier ist der Test:

#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 

Ist es möglich, durch Storyboards geladenen Abhängigkeiten für View-Controller spotten, wenn Typhoon mit?

Antwort

0

So, nach einem bisschen mehr zu untersuchen, habe ich eine Lösung gefunden, hatte aber von der Verwendung PList Integration zu AppDelegate Integration Durchführung der initialFactory Methode wechseln:

AppDelegate.h:

- (id)initialFactory; 

AppDelegate.m :

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

ANYTableViewControllerTests.m:

Ich würde gerne wissen, ob es eine Möglichkeit gibt, dies mit PList-Integration zu bewerkstelligen obwohl/warum es nicht funktioniert mit PList-Integration.