[英]How to inject fake, stubbed or mock dependencies for Integration tests using Typhoon
[英]How to mock storyboard view controller dependencies from tests when using Typhoon?
使用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
使用Typhoon时,是否可以模拟情节提要加载的视图控制器的依赖关系?
因此,经过更多调查,我找到了一个解决方案,但不得不从使用PList Integration切换到实现initialFactory
方法的AppDelegate 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集成中不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.