我想为程序集本身编写测试,以确保我没有告诉程序集注入一个在注入的类中不存在(不再存在)的属性。由于这会在运行时导致错误,我想确保程序集可以注入,例如正确的视图控制器,无需在应用程序中手动导航到视图控制器进行测试。
我有一组用Objective-C和Swift编写的混合程序集。 一个简单的测试看起来像这样: OBJ-C:
@interface ViewControllerAssemblyTests : XCTestCase
@property (nonatomic, strong) ViewControllerAssembly *sut;
@end
@implementation ViewControllerAssemblyTests
- (void)setUp {
[super setUp];
self.sut = [ViewControllerAssembly new];
[self.sut activate];
}
- (void)testInstantiateSignInViewController {
// When
SignInViewController *vc = [self.sut signInViewController];
// Then
XCTAssertNotNil(vc.alertService);
}
@end
夫特:
class ViewControllerAssemblyTests: XCTestCase {
var sut: ViewControllerAssembly!
override func setUp() {
super.setUp()
self.sut = ViewControllerAssembly()
self.sut.activate()
}
func testExample() {
// When
let vc = self.sut.signInViewController() as! SignInViewController
// Then
XCTAssertNotNil(vc.alertService)
}
}
运行用Objective-C编写的测试工作正常。但是,在激活程序集时,使用Swift测试编写的测试失败:Key '...' is already registered
。
我发现TyphoonCollaboratingAssembliesCollector
发现用Swift编写的程序集两次 - 一次在app目标中,再一次在测试目标中,这会在尝试注册程序集的键时导致上述错误。
这一切都归结为方法inspectedClass
的{{1}}参数的类型,它是运行Obj-C测试时应用程序目标的正确程序集,但它是来自的错误程序集运行Swift测试时测试目标。我明显地将组件添加到两个目标,以便能够在测试中访问它们。
我目前的解决方法是简单地在Obj-C中编写测试,但有没有解决方案,所以我可以在Swift中编写测试?