2015-01-13 22 views
12

Do một vài vấn đề, tôi muốn mục tiêu XCTest trong một dự án chạy một ứng dụng riêng biệt đại biểu. Sử dụng ObjC, đây là một quá trình tương đối đơn giản: thao tác main.m (xem: https://stackoverflow.com/a/15725328/1299041).iOS Swift: Tách riêng AppDelegate cho XCTest

Vì có vẻ như ứng dụng Swift được khởi tạo với @UIApplicationMain trong AppDelegate, có thể khởi tạo với một AppDelegate riêng biệt cho mục tiêu thử nghiệm không?

Trả lời

11

Bạn không nên thêm điều kiện để kiểm tra mã bình thường nếu đang kiểm tra. Thay vào đó, bạn nên thử các bài kiểm tra AppDelegate để làm bất cứ điều gì bạn muốn.

Sau đó, bạn có thể thay thế đại biểu UIApplication là setUp trong lớp siêu của mỗi XCTestCase 'es của bạn.

class MockAppDelegate:NSObject, UIApplicationDelegate { 

} 


class BaseTest: XCTestCase { 

    override func setUp() { 
     super.setUp() 
     UIApplication.sharedApplication().delegate = MockAppDelegate() 
     } 
} 
class Test1: BaseTest { 

    override func setUp() { 
     super.setUp() 
     // normal testing 
     } 
} 

Nếu bạn vẫn muốn dừng thực thi mã cho các xét nghiệm này là phương pháp của tôi hoạt động tốt:

Bạn có thể thêm tham số khởi động để ứng dụng mà chỉ ra rằng đây là chạy thử nghiệm App Start execution

Các thông số này có thể truy cập từ NSUserDefaults

#define IS_TESTS [[NSUserDefaults standardUserDefaults] boolForKey:@"TESTING"] 
+4

Đây là điểm tốt, tôi đồng ý với việc không bổ sung các điều kiện liên quan đến kiểm tra vào mã thông thường. Những gì tôi thực sự cố gắng làm là dừng mã thực hiện trong 'AppDelegate' chính (xử lý trạng thái người dùng & phiên và lưu trữ dữ liệu). Thật không may, việc tạo một 'MockAppDelegate' không thực hiện điều đó. – Whoa

+0

Tôi đã chỉnh sửa câu trả lời của mình, có một cách để kiểm tra điều này cũng trong Swift. Chỉ cần đặt câu lệnh 'if' trong ủy nhiệm ứng dụng của bạn. –

+5

Điều này sẽ không ngăn ứng dụng bình thường ủy nhiệm chạy, phải không? Ý tôi là, thông thường 'didFinishLaunchingWithOptions' của AppDelegate được kích hoạt trước khi các bộ thử nghiệm bắt đầu chạy. –

1

này giải pháp này như sau:

  1. Duplicate Target ứng dụng hiện tại của bạn và đổi tên nó thành một cái gì đó phù hợp. Trong trường hợp của bạn có thể 'TestingHarness' hoặc một số như vậy. Lưu ý rằng bạn cũng sẽ muốn thay đổi mã định danh gói và đổi tên tệp Info.plist tương ứng. Đổi tên tệp Info.plist có nghĩa là bạn sẽ cần thay đổi cài đặt tên tệp Info.plist trong tab Cài đặt xây dựng của mục tiêu mới để khớp với tên mới.

  2. Tạo một tệp khác *AppDelegate.swift. Trong trường hợp của bạn, tôi gọi nó là TestAppDelegate.swift.

  3. Sao chép nội dung của tệp hiện tại AppDelegate.swift vào TestAppDelegate.swift và chỉnh sửa như mong muốn. Đảm bảo để lại chú thích @UIApplicationMain và triển khai các cuộc gọi lại UIApplicationDelegate cần thiết.

  4. Thay đổi thành viên mục tiêu của mỗi *AppDelegate.swift tập tin của bạn để AppDelegate.swift không được bao gồm trong mục tiêu mới 'TestHarness' của bạn và TestAppDelegate.swift không được bao gồm trong mục tiêu ứng dụng chính của bạn. (Bạn sửa Target thành viên của một tập tin bằng cách chọn nó trong File Browser và mở Inspector File mà bạn có thể truy cập ở bên phải thanh bên theo mặc định, hoặc bằng cách chọn nó trong menu dưới View -.> Utilities)

  5. Bây giờ bạn có hai mục tiêu riêng biệt với các Đại biểu ứng dụng riêng biệt mà bạn có thể tạo và chạy độc lập. Bước cuối cùng là chọn mục tiêu 'TestHarness' mới của bạn làm Ứng dụng Máy chủ lưu trữ cho các mục tiêu thử nghiệm của bạn. (Nhấp vào mục dự án cấp cao nhất trong File Browser, sau đó nhấp vào mục tiêu thử nghiệm mong muốn của bạn trong tiểu niêm yết. Trên tab General, bạn sẽ thấy máy chủ ứng dụng như thả chỉ có xuống.)

Lưu ý: các hướng dẫn này dành cho Xcode 7.2.

Các vấn đề liên quan