Không tìm thấy XCTest / XCTest.h trên các dự án cũ được xây dựng trong Xcode 6


82

Tôi có một vài dự án đang cố gắng xây dựng bằng Xcode 6 Beta 2. Tất cả các dự án đều có một số loại thư viện sử dụng XCTest (Kiwi / XCTest và Specta) không được xây dựng trong Xcode 6 vì XCTest / XCTest.h không thể được tìm thấy.

fatal error: 'XCTest/XCTest.h' file not found
#import <XCTest/XCTest.h>

Tôi nhận thấy rằng XCTest.framework không còn nằm trong danh sách giai đoạn xây dựng "Liên kết Thư viện với Binaries", nhưng điều đó tốt vì khi tôi tạo một dự án mới với Xcode 6, thư viện sẽ tự động được liên kết.

Có lẽ vì một số khả năng thanh toán, các phụ thuộc cần XCTest của tôi đều được đưa vào thông qua Cocoapods.

Có điều gì tôi không biết mà tôi cần cập nhật với dự án của mình không?

Câu trả lời:


142

Lưu ý: Điều này có thể không cần thiết cho bất kỳ dự án nào được tạo trong Xcode 7.

CocoaPods đã có một bản sửa lỗi cho điều này ở đâyở đây


Để khắc phục điều này cho bất kỳ phụ thuộc CocoaPod nào, bạn cần thêm phần sau FRAMEWORK_SEARCH_PATHSvào bất kỳ mục tiêu Pod nào yêu cầu XCTest (ví dụ: Kiwi, Specta, FBSnapshotTestCase, v.v.).

$(PLATFORM_DIR)/Developer/Library/Frameworks

ảnh chụp màn hình

Điều này sẽ cho phép bạn tham chiếu XCTest trong bất kỳ phụ thuộc nào bạn có thể có. Điều này có thể được khắc phục trong bản cập nhật CocoaPods trong tương lai hoặc Pod mà bạn đang tham khảo, vì vậy bạn có thể muốn xóa nó sau.

Nó không gây bất lợi cho các phiên bản trước đó của Xcode vì vậy nên sử dụng an toàn.


Cảm ơn bạn squarefrog. Vấn đề liên quan là ở đây
fatuhoku

1
Khi nào lên lịch phát hành tiếp theo?
fatuhoku

6
Điều này dường như không hoạt động với KIM trong xcode 6 GM ..?
Thomas Clowes

3
Tôi không đồng ý với "không liên quan đến Xcode 7". Tôi đã gặp sự cố trong Xcode 7.1. Sự cố đã biến mất sau khi tôi thêm đường dẫn tìm kiếm khung đó theo hướng dẫn ở trên. Tôi cho rằng một dự án bắt đầu bằng Xcode 7 sẽ không gặp sự cố, nhưng câu hỏi ở đây là xây dựng các dự án cũ hơn trong Xcode mới hơn.
Jerry Krinock

1
kể từ XCode 9, bạn nên đặt cài đặt bản dựng FRAMEWORK_SEARCH_PATHS thành $ (DEVELOPER_FRAMEWORKS_DIR) và $ (kế thừa)
berbie

40

Tôi đang di chuyển các tệp trong một dự án xung quanh. Tất cả những gì bạn phải làm là chọn các tệp thử nghiệm của mình, xxxTests.mv.v. và file inspectorchọn targetlàm testmục tiêu chứ không phải là mục tiêu thông thường.


1
Chính xác những gì đã xảy ra với tôi. Tôi đã không nhận thấy rằng khi tôi di chuyển nó, mục tiêu cho tệp "đã thay đổi." Tôi nên nghĩ về nó dựa trên cách nó được di chuyển (xóa trong Xcode và thêm lại). Cảm ơn.
chadbag

1
câu trả lời đơn giản phù hợp với tôi. Gặp sự cố khi tôi đổi tên tệp của mình và đây là cách giải quyết trong trường hợp của tôi.
Simon

17

Tôi nhận thấy rằng XCTest chỉ có sẵn cho mục tiêu thử nghiệm (trong Xcode 6). Nếu bạn đang sử dụng XCTest cho bất kỳ mục tiêu nào khác (vì bất kỳ lý do gì), bạn sẽ thấy XCTest.h not foundlỗi.


Đó là nó. Cocoapods tạo các dự án / mục tiêu thư viện tĩnh. Tốt tìm thấy!
Erik Kerber

1
Rất có thể bạn sẽ cần phải di chuyển tất cả mã liên quan đến XCTest sang mục tiêu thử nghiệm.
Mustafa

Sẽ rất khó nếu bạn đang sử dụng CocoaPods để đưa Kiwi hoặc Specta vào dự án của mình.
squarefrog

2
Vậy ... cách khắc phục là gì?
fatuhoku

12

Lỗi này xuất hiện khi bạn đã thêm tệp mà XCTest đang được sử dụng bên ngoài mục tiêu thử nghiệm. Để khắc phục điều này trong AppCode, bạn có thể nhấp chuột phải vào bất kỳ tệp nào bị nghi ngờ và chọn 'Quản lý mục tiêu', sau đó đảm bảo rằng chỉ mục tiêu thử nghiệm được chọn.


Tôi đã gặp phải vấn đề này nhiều hơn một lần.
pshah

Điều này đã xảy ra với tôi sau khi di chuyển các tệp trong một dự án và thêm lại chúng dưới mục tiêu sai.
Giles

11

@squarefrog có câu trả lời đúng nhưng bạn sẽ phải tiếp tục làm điều đó theo cách thủ công mỗi khi cập nhật nhóm của mình :(

Nếu bạn thêm cái này vào podfile của mình, nó sẽ tự động thêm đường dẫn bổ sung cho bạn. Ví dụ: nếu bạn muốn thêm $(PLATFORM_DIR)/Developer/Library/Frameworksvào FRAMEWORK_SEARCH_PATHSSpecta:

post_install do |installer|
    target = installer.project.targets.find { |t| t.to_s == "Pods-Tests-Specta" }
    if (target)
        target.build_configurations.each do |config|
            s = config.build_settings['FRAMEWORK_SEARCH_PATHS']
            s = [ '$(inherited)' ] if s == nil;
            s.push('$(PLATFORM_DIR)/Developer/Library/Frameworks')
            config.build_settings['FRAMEWORK_SEARCH_PATHS'] = s
        end
    else
        puts "WARNING: Pods-Tests-Specta target not found"
    end
end

Lưu ý rằng bạn có thể cần thay đổi "Pods-Tests-Specta"để phù hợp với cài đặt dự án của mình hoặc chỉ cần sử dụng vòng lặp mà @squarefrog đã đề xuất để lặp lại mọi mục tiêu.
pix0r

1
Tôi bỏ lỡ- @squarefrog không đề xuất vòng lặp. Ý tôi là thay thế dòng 2-3 trong giải pháp của @ deanWombourne bằng: installer.project.targets.each do |targetđể lặp lại tất cả các mục tiêu và áp dụng thay đổi.
pix0r

2

Tôi đã gặp phải vấn đề tương tự sau một thời gian tôi đã nhập khung XCTest từ các giai đoạn xây dựng và giải quyết vấn đề.

Xây dựng các giai đoạn-> XCTest.Framework> dọn dẹp và chạy. Tôi hy vọng nó sẽ hữu ích cho một số người ..

để bạn tham khảo ... Nhập XCTest vào dự án hiện có


Điều này phù hợp với tôi, nhưng tôi cũng phải đi tới Cài đặt mục tiêu cho các thử nghiệm mới và trên tab Chung, chọn hộp kiểm tra API của ứng dụng.
Fran K.

1

Tính đến thời điểm viết bài, phiên bản mới nhất của Cocoapods (0.33.1) không có bản sửa lỗi cho sự cố.

Nhưng phiên bản tiên tiến thì có.

Làm theo hướng dẫn này để thiết lập phiên bản mới nhất của Cocoapods từ nguồn. Tôi gọi là của tôi pod-dev(được đề cập trong hướng dẫn) để phân biệt với phiên bản pod được cài đặt bằng đá quý.

Lợi ích của phương pháp này là bạn không cần thêm script trong Podfile của mình. Bạn chỉ cần nhớ làm một pod-dev installthay vì thông thường pod install.


1

Cách tốt nhất để có XCTest là thêm nó từ Test Nagigator (biểu tượng thứ 5 trong khung bên trái).

Hành động như vậy, tệp thử nghiệm xx.m mới không nhắm mục tiêu (trong ngăn bên phải) một ứng dụng (trong ngăn bên trái> Mục tiêu, Tiện ích mở rộng gói: ứng dụng), mà là một gói (Tiện ích mở rộng gói: xctest)

  • XCTest.framework vẫn có màu Đỏ,
  • do một số sửa đổi mà bạn có thể gặp lỗi 'XCTest/XCTest.h' file not found, đó là do tệp của bạn phải nhắm mục tiêu một ứng dụng.

0

Đây là công việc dễ dàng nhất mà tôi đã tìm thấy. Không cần thay đổi dự án. Và thay đổi này sẽ tiếp tục cho đến khi bạn nâng cấp Xcode tiếp theo:

cd /Applications/Xcode6-Beta7.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/Developer/Library/Frameworks
ln -s ../../../../../Library/Frameworks/XCTest.framework

Nhược điểm của điều này là nếu bạn chia sẻ dự án của mình với người khác vì bạn phải yêu cầu họ thực hiện hành động này, mỗi lần có bản cập nhật Xcode. Đây là một vấn đề với việc triển khai Cocoapods, do đó, nên giải quyết bằng cách sử dụng Cocoapods!
squarefrog

Đã đồng ý. Và điều này không hoàn hảo. Nhưng nó thực sự dễ dàng và chia tỷ lệ tốt với số lượng nhóm bạn có (O (1)). Số Xcode 6 phiên bản đã tốt hơn được giới hạn quá :-)
Steven Kramer

Việc thêm đường dẫn vào các đường dẫn tìm kiếm trong khuôn khổ dường như không cắt được nó: các bài kiểm tra sẽ xây dựng, nhưng không chạy. Rõ ràng là do gói thử nghiệm không thể giải quyết khuôn khổ XCTest.
Steven Kramer

0

Trong một dự án không có Cocoapods (vì vậy không trả lời trực tiếp câu hỏi của OP nhưng có lẽ hữu ích cho tôi hoặc những người khác trong tương lai), chúng tôi đã gặp vấn đề tương tự. Nó đã được giải quyết bằng cách thay thế các mục OCTest trước đây của chúng tôi bằng XCTest. Ví dụ: tệp MyApp.xcodeproj / project.pbxproj có khác biệt này (rút gọn); - path = MyAppUnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + path = MyAppUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.