2014-10-31 16 views
9

Cập nhật 3/23/2016 Tôi vừa thử nghiệm mã mẫu ban đầu của mình bên dưới và tất cả biên dịch đều tốt trong XCode 7.3. Có vẻ như XCTAssertNil đã được cập nhật trên đường đi để có một biểu thức kiểu () throws -> Any? Do đó câu hỏi và câu trả lời này có thể không còn cần thiết nữa (ngoại trừ một thời gian với các phiên bản cũ hơn của trình biên dịch.)Làm thế nào để sử dụng XCTAssertNil với các cấu trúc tùy chọn?

Tôi đang viết các bài kiểm tra đơn vị đầu tiên của mình trong XCode với XCTest. Tôi không chắc chắn làm thế nào người ta có thể tận dụng lợi thế của XCTAssertNil vì nó dường như chỉ biên dịch khi sử dụng một số loại. Nó xuất hiện nó sẽ làm việc với các tùy chọn được tạo ra từ các lớp và các thành phần nguyên thủy được xây dựng sẵn, nhưng không phải là các cấu trúc. Làm thế nào sẽ đi về bằng cách sử dụng phương pháp này?

Đối với cấu trúc trình biên dịch cung cấp cho các lỗi sau (giả sử 'SimpleStruct' là tên của loại của bạn):

'SimpleStruct' is not identical to 'AnyObject' 

Dưới đây là một lớp học thử nghiệm đơn giản để minh họa một số loại mà biên dịch ổn và khác là rằng don 't.

import Cocoa 
import XCTest 

struct SimpleStruct { 
} 

class SimpleClass { 
} 

class Tests: XCTestCase { 

    func testl() { 
     var simpleStruct:SimpleStruct? = nil; 
     var simpleClass:SimpleClass? = nil; 
     var i:Int? = nil; 
     var s:String? = nil; 
     var tuple:(Int,String)? = nil; 

     XCTAssertNil(simpleStruct); // compile error 
     XCTAssertNil(simpleClass); // OK 
     XCTAssertNil(i); // OK 
     XCTAssertNil(s); // OK 
     XCTAssertNil(tuple); // compile error 
    } 

} 

Trả lời

11

Cập nhật 2016/03/23 Cập nhật cho XCode 7.3 (tuy nhiên nếu bạn thấy chỉnh sửa của tôi cho câu hỏi, nó sẽ xuất hiện workaround này không còn cần thiết)

Dưới đây là một cách giải quyết. Tôi đã tạo chức năng chung của riêng mình:

func AssertNil<T>(@autoclosure expression:() -> T?, message: String = "", 
       file: StaticString = #file, line: UInt = #line) { 

    if (expression() != nil) { 
     XCTFail(message, file:file, line:line) 
    } 
} 

Có vẻ như điều này không cần thiết. Đây có phải là kết quả của XCTest ban đầu nhắm mục tiêu Objective-C và không được cập nhật/cầu nối đủ cho Swift chưa?

Chỉnh sửa: Tôi đã thực hiện đủ nghiên cứu để thấy rằng AnyObject có thể được sử dụng để đại diện cho bất kỳ lớp nào nhưng không phải cấu trúc. Tuy nhiên, điều đó sau đó không giải thích tại sao mã trong bài gốc của tôi biên dịch cho kiểu Int và kiểu String. (Tôi đọc ở một nơi khác mà Xcode có thể tự động chuyển đổi chúng thành NSNumber và NSString cho bạn mà có thể giải thích tại sao. Hãy xem http://www.scottlogic.com/blog/2014/09/24/swift-anyobject.htmlhttp://www.drewag.me/posts/swift-s-weird-handling-of-basic-value-types-and-anyobject. Tôi sẽ cố gắng loại bỏ việc nhập khẩu Ca cao nhập khẩu Quỹ để xem điều gì sẽ xảy ra)

Edit2: XCTest cũng nhập khẩu Foundation vì vậy tôi không thể kiểm tra những gì tôi muốn. Tôi có thể tạo ra các phương pháp của riêng mình và kiểm tra điều này. Bây giờ, tôi giả định rằng các chuyển đổi tự động là những gì đang cho phép các tùy chọn int và chuỗi biên dịch. Có vẻ như XCTest không hoàn toàn sẵn sàng cho thời gian đầu với Swift.

Cập nhật 8/13/2015: Đã chỉnh sửa chức năng tương thích với XCode 7 beta

+0

Vâng, có vẻ như XCTest cần một ít công việc. Bây giờ công việc của tôi xung quanh hoạt động tốt cho tôi. Tôi sẽ cập nhật thông báo để có nhiều thông tin hơn trong trường hợp lỗi thay vì mặc định thành chuỗi rỗng. –

+0

Điều này không còn hoạt động trong Xcode 7.3 – Jeef

+0

Cảm ơn @Jeef. Tôi sẽ cập nhật câu trả lời của tôi để gọi ghi chú này. –

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