ios - swift 中的单元测试 | IOS Storyboard |无法转换 objective-c 中定义的 View Controller 类

标签 ios objective-c swift unit-testing storyboard

所以我正在尝试为我的 Controller 类之一写下一些测试用例,

  1. 我的 View Controller 在 objective-c 中定义。
  2. 我正在用 swift 编写测试用例。
  3. 我已将我的 viewcontroller 类包含在我的主要目标和我的测试目标中。
  4. 我还在测试和主要目标中添加了 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 输入肯定可以帮助我识别这些问题,下面是我为了使事情正常进行而纠正的事情。

  1. 从测试目标中删除除测试用例之外的所有代码文件。
  2. 确保我的主要目标和测试目标有单独的模块名称。
  3. 确保我的 Pods 文件也为我的测试目标安装了库。
  4. 为了安全起见,用 Swift 编写测试用例,这样我就不需要在测试用例中包含 Appname-swift.h。
  5. 使用@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/

相关文章:

objective-c - 从 NSInvocation 获取参数值

ios - 以编程方式添加约束时找不到 super View ?

iphone - 有没有办法将 iOS 应用程序分发给特定的人群(超过 100 人)?

ios - 如何在核心数据中设置与对象的关系?

iOS - NSURLConnection - 检查 URL

ios - 使用 userDefaults 保存自定义背景颜色

json - 需要帮助使用 Alamofire 使用 Swift 解析 JSON

ios - Objective C - 使用 NSString 的 Switch 语句

objective-c - UIStutsbar SetHidden 在 ios 5 中不起作用?

objective-c - UIPageViewController 取消页面滑动