所以我正在尝试为我的 Controller 类之一写下一些测试用例,
- 我的 View Controller 在 objective-c 中定义。
- 我正在用 swift 编写测试用例。
- 我已将我的 viewcontroller 类包含在我的主要目标和我的测试目标中。
- 我还在测试和主要目标中添加了 Storyboard。
在我的测试中,我试图从 Storyboard加载 View Controller ,下面是代码(这段代码在我的 swift 类的正常项目中工作正常)
let storyboard = UIStoryboard.init(name: "Main", bundle: Bundle.init(for: self.classForCoder))
let viewController:UIViewController = storyboard.instantiateViewController(withIdentifier: "loginViewController")
print(viewController.classForCoder)
print(type(of: viewController))
let _ = viewController.view
controller = viewController as! LoginViewController
打印输出
LoginView Controller
__ABT_LoginViewController
我的代码的最后一行失败了
controller = viewController as!登录 View Controller
错误我正在下面
无法将类型“__ABT_LoginViewController”(0x600000053b30)的值转换为“LoginViewController”(0x11e88de30)。
需要你们的帮助
已更新 因此,在遵循@dashandrest 的回答后,上述问题得到解决,现在我面临新问题,我已经为测试用例创建了一个 TestAppdelegate 文件,在我的 TestAppDelegate 类中,我现在在编译整个代码后导入“App-swift.h”它在 App-swift.h 文件中给出错误,提到无法导入模块 AppName,我的主要目标模块名称是 AppName,而测试目标模块名称是 AppNameTest,
#import "App-swift.h"
现在我在 App-swift.h 文件中遇到编译错误。
#if defined(__has_feature) && __has_feature(modules)
@import ObjectiveC;
@import AppName; ///this line generate compile errror, module AppName not found
@import XCTest;
#endif
已更新
因此我解决了我的应用程序中的多个问题,@DashAndRest 输入肯定可以帮助我识别这些问题,下面是我为了使事情正常进行而纠正的事情。
- 从测试目标中删除除测试用例之外的所有代码文件。
- 确保我的主要目标和测试目标有单独的模块名称。
- 确保我的 Pods 文件也为我的测试目标安装了库。
- 为了安全起见,用 Swift 编写测试用例,这样我就不需要在测试用例中包含 Appname-swift.h。
- 使用@testable import AppModuleName(按照@DashAndRest 的建议)
最佳答案
这不是必需的:
3 I have included my viewcontroller class in both my main target and my test target.
4 I have also added the storybaord in both test and main target.
尝试取消选中 View Controller 和 Storyboard的测试目标。
然后在你的测试文件中只包含主要目标:
@testable import Your-Main-Target-Name
更新
App-swift.h
仍然令人困惑。
但是如果你想测试LoginViewController
,这里是解决方案:
添加Bridging Header到您的主要 AppName 目标并将所有 objective-c 类导入它,例如:
#ifndef AppName_Bridging_Header_h
#define AppName_Bridging_Header_h
#import "LoginViewController.h"
#endif
在此之后,您的 LoginViewController
类将可供所有其他 swift 类使用,包括测试目标。
在测试目标中添加新文件,如 LoginVCTests.swift
并向其添加以下代码-
import XCTest
@testable import AppName
class LoginVCTests: XCTestCase {
func testSomeLogic() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController:UIViewController = storyboard.instantiateViewController(withIdentifier: "loginViewController") as! LoginViewController
print(viewController.classForCoder)
print(type(of: viewController))
let _ = viewController.view
//test on viewController
}
}
希望这能解决您的问题!
关于ios - swift 中的单元测试 | IOS Storyboard |无法转换 objective-c 中定义的 View Controller 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44138661/