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?