Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call an Objective-C class from a Swift test file

I'm working on implementing unit tests. The original project was written in Objective-C.

I created a new Test Target that is written in Swift.

How do I call an Objective-C class of the actual app in my test file?

I've tried doing the following.

@testable import MyModule

However, this seems to only work if all the files are in Swift, which is not the case for me.

I've tried several other things with the project settings however, none of these seemed to work.

Am I missing something blatantly obvious?

class MyTests: XCTestCase {

    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }

    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    func testExample() {
        let vc = HomeViewController() //this line is failing. How do I expose this view controller written in objective c?
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
    }
}
like image 257
prawn Avatar asked Aug 22 '16 18:08

prawn


1 Answers

You need to create bridging header and add Objective-C file in to that. Create a bridging header YourProductName-Bridging-Header.h and then import HomeViewController in bridging header.

To import Objective-C code into Swift from the same target

In your Objective-C bridging header file, import every Objective-C header you want to expose to Swift. For example:

#import "XYZCustomCell.h"
#import "XYZCustomView.h"
#import "XYZCustomViewController.h" 

In Build Settings, in Swift Compiler - Code Generation, make sure the Objective-C Bridging Header build setting under has a path to the bridging header file. The path should be relative to your project, similar to the way your Info.plist path is specified in Build Settings. In most cases, you should not need to modify this setting.

Below are some resources which can help you

  1. Using Swift with Objective-C
  2. Answer to another stack overflow qustion
  3. How to use Objective-C in swift
like image 147
Adnan Aftab Avatar answered Oct 17 '22 14:10

Adnan Aftab