Không có mô-đun nào như vậy, khi sử dụng @testable trong các bài kiểm tra Đơn vị Xcode


168

Gần đây tôi đã cập nhật lên Xcode 7 beta 5. Tôi đã thử thêm một bài kiểm tra đơn vị cho một dự án trước đó, nhưng tôi nhận được thông báo lỗi "Không có mô-đun như vậy [myModuleName]" trên @testable import myModuleNamedòng.

nhập mô tả hình ảnh ở đây

Tôi đã thử

  • làm sạch dự án với OptionClean Build Folder
  • kiểm tra xem "Bật khả năng kiểm tra" (gỡ lỗi) đã được đặt thành Có trong Tùy chọn bản dựng
  • xóa mục tiêu kiểm tra và sau đó thêm lại gói thử nghiệm Đơn vị iOS

Không ai trong số này làm việc cho dự án này (nhưng tôi đã thử nghiệm để làm việc trong dự án khác). Có ai khác có vấn đề này và giải quyết nó?



Nếu bạn đang xây dựng từ dòng lệnh với xcodebuild, hãy đảm bảo thêm cờ -workspace cho lệnh xây dựng của bạn. Tôi đã giải quyết vấn đề này trên chuyến đi của tôi theo cách đó.
Victor 'Chris' Cabral

Câu trả lời:


210

Vui lòng kiểm tra Tên mô-đun mà bạn cố gắng nhập @testable import "ModuleName". Tên mô-đun phải giống nhau trênTarget->Build Settings-> Product Module Name


5
Hầu hết các trường hợp, đó là về tên mô-đun sản phẩm. Kiểm tra space_
onmyway133

5
cẩn thận về -_. Một trong những dự án của tôi có dấu trừ -trong tên, nhưng mô-đun có dấu gạch dưới _thay vào đó
beryllium

4
tôi đã sử dụng ""ý tưởng và đã nhận đượcExpected identifier in import declaration
abbood 16/11/18

1
@ onmyway133 đã rất gần. Trong trường hợp của tôi, tôi đã có một tên mô-đun sản phẩm khác với tên dự án của tôi. Để tìm tên mô-đun của bạn, hãy Build Settingschọn dự án của bạn (không phải kiểm tra hoặc kiểm tra giao diện người dùng), sau đó tìm kiếm PRODUCT_MODULE_NAMEbất cứ thứ gì hiển thị, đó là những gì nên theo sau@testable import
jonmecer

115

Câu trả lời có hiệu quả với tôi

Câu trả lời là tôi đã có một số lỗi trong dự án của mình khiến việc xây dựng thất bại. (Đó chỉ là lỗi tiêu chuẩn hàng ngày của bạn trong mã.) Sau khi tôi sửa lỗi và thực hiện một bản sửa lỗi và xây dựng khác, nó đã hoạt động.

Lưu ý rằng những lỗi này không xuất hiện lúc đầu. Để khiến họ xuất hiện:

  • Nhận xét toàn bộ tệp Kiểm tra của bạn gây ra lỗi "Không có mô-đun như vậy".
  • Hãy thử chạy dự án của bạn một lần nữa.

Nếu có lỗi khác, họ sẽ hiển thị ngay bây giờ. Sửa chúng và sau đó bỏ ghi chú mã tập tin thử nghiệm của bạn. Lỗi "Không có mô-đun như vậy" đã biến mất đối với tôi.


Trong trường hợp điều này không giải quyết được vấn đề cho người khác, bạn cũng có thể thử các cách sau:

Làm sạch thư mục xây dựng

Mở menu Sản phẩm, nhấn và giữ Option"Làm sạch thư mục xây dựng ..."

nhập mô tả hình ảnh ở đây

Đảm bảo rằng Bật khả năng kiểm tra được đặt thành Có

Trong Project Navigator, nhấp vào tên dự án của bạn. Chọn Cài đặt bản dựng và cuộn xuống Tùy chọn bản dựng. Đảm bảo rằng Bật khả năng kiểm tra là Có (để gỡ lỗi).

nhập mô tả hình ảnh ở đây

Xóa và thêm lại mục tiêu Thử nghiệm của bạn

Nếu bạn đã làm những điều khác, tôi đoán là bạn có thể không cần phải làm điều này. Nhưng nếu bạn làm như vậy, hãy nhớ lưu bất kỳ Bài kiểm tra đơn vị nào mà bạn đã viết.

Nhấp vào tên dự án của bạn trong Project Navigator. Sau đó chọn mục tiêu Thử nghiệm của bạn. Nhấp vào nút trừ (-) ở dưới cùng để xóa nó.

nhập mô tả hình ảnh ở đây

Sau đó nhấp vào nút dấu cộng (+) và chọn Gói kiểm tra đơn vị iOS để thêm lại. Như bạn có thể thấy, bạn cũng có thể thêm Gói kiểm tra giao diện người dùng theo cách tương tự.

Một vài ý tưởng khác

  • Hãy chắc chắn rằng tất cả các lớp bắt buộc là thành viên của mục tiêu thử nghiệm của bạn.
  • Hãy chắc chắn rằng bạn đã thêm tất cả các thư viện cần thiết.
  • Đảm bảo rằng tên mô-đun được viết chính xác (xem câu trả lời này ).

Hoặc là...

Để lại một bình luận hoặc câu trả lời dưới đây nếu bạn tìm thấy một cái gì đó khác làm việc.

Liên quan


2
Có tất cả các vấn đề tương tự ở đây, với Xcode 7 beta 5. Thật không may, các bước trên dường như không giải quyết được - mô-đun vẫn liên quan đến, "không có mô-đun 'Tiện ích' như vậy." Sự khác biệt duy nhất từ ​​ảnh chụp màn hình của bạn là tôi đang cố gắng để nó hoạt động với thư mục kiểm tra giao diện người dùng (GlimpulseUITests trong trường hợp của tôi). Có phải @testable không hoạt động với mục tiêu kiểm tra UI?
Zac

5
*** QUAN TRỌNG *** Nếu bạn xóa và thêm lại Mục tiêu kiểm tra, nó sẽ tạo lại một mẫu kiểm tra trống ghi đè lên các bài kiểm tra hiện có của bạn. Hãy chắc chắn để lưu các nguồn kiểm tra của bạn trước khi làm điều này.
pauln

2
Đối với tôi, ngay cả các lớp riêng lẻ của tôi cũng không được hiển thị trong khi gõ ... Cuối cùng tôi đã thực hiện Sản phẩm> Làm sạch, khởi động lại XCode. Khi nó khởi động lại, hãy dành vài giây để hoàn thành lập chỉ mục và sau đó voila tất cả các tài liệu tham khảo của tôi xuất hiện mà không phải bao gồm mỗi lớp là thành viên của mục tiêu thử nghiệm.
Rajive Jain

1
Ngoài ra nếu bạn chưa thử điều này, hãy nhấp vào khung còn thiếu của bạn ở bên trái, sau đó ở bên phải chọn "Tư cách thành viên mục tiêu" và đưa nó vào mục tiêu thử nghiệm đơn vị của bạn.
albogdano

3
Chuyển đến xây dựng cài đặt của mục tiêu chính của bạn -> "Tên mô-đun sản phẩm" và xem liệu nó có khớp với tên mô-đun bạn thử nhập trong thử nghiệm của mình không.
f0rz

64

Vấn đề đối với tôi là mục tiêu triển khai iOS của các bài kiểm tra không được đặt giống như mục tiêu chính. Vì vậy, hãy chắc chắn để kiểm tra này.

Trong mục tiêu thử nghiệm của bạn:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>

Sau khi làm điều đó, tôi đã phải thiết lập Enable Bitcodeđể Notrên Bundle thử nghiệm.
pableiros

2
Lol nó hoạt động nhưng thật ngu ngốc từ xcode mà nó không gây ra lỗi khác
J. Doe

31

Vì vậy, đây là cách tôi bắt đầu làm cho mã của mình hoạt động sau khi thử tất cả các giải pháp được đề xuất từ ​​các đề xuất trước.

  • Tôi đặt 'Bật khả năng kiểm tra' thành 'CÓ' trong Cài đặt bản dựng của dự án
  • Tôi cũng đặt 'Xác định mô-đun' thành 'CÓ' trong Cài đặt bản dựng của dự án.
  • Đối với (các) tệp .swift thông thường trong dự án của tôi, giả sử MyApp , tôi sẽ viết các trường hợp thử nghiệm, tôi có cả mục tiêu " MyApp " chính và " MyAppUnitTests " được chọn trong Tư cách thành viên mục tiêu .
  • Sau đó, tôi đã chọn (các) tệp kiểm tra đơn vị của mình, đã khai báo ' @testable nhập MyApp ' ở trên cùng, bên dưới ' nhập XCTest ' và chỉ kiểm tra "MyAppUnitTests" trong tư cách thành viên Target

Và mọi thứ làm việc như quyến rũ. Hi vọng điêu nay co ich.


8
Kích hoạt tính năng kiểm tra và Xác định Mô-đun là những gì đã làm. Tôi không cần thay đổi tư cách thành viên mục tiêu cho các tệp * .swift thông thường.
George Yacoub

Tôi đã làm tất cả các bước trên nhưng tôi vẫn không có lỗi mô-đun như vậy. dự án của tôi là một sự pha trộn nhanh chóng
Mikael

@Mikael, bạn có đang viết bài kiểm tra chỉ cho các tệp Swift trong cơ sở mã hỗn hợp Objc / Swift của bạn không? (Tôi hỏi bởi vì, lần trước tôi đã kiểm tra, tôi nghĩ rằng 'nhập khẩu @testable' chỉ hoạt động để viết các trường hợp kiểm tra cho các tệp Swift ngay cả trong hỗn hợp cơ sở mã Obj-c / Swift. Bây giờ có lẽ nó đã thay đổi. nếu tôi sai ở đây).
Vick Swift

6
Tôi tìm thấy vấn đề của tôi. Đó là do Kiến trúc hợp lệ của mục tiêu Thử nghiệm của tôi không giống với cấu hình Kiến trúc hợp lệ của mục tiêu chính của tôi. Bây giờ nó hoạt động. Btw, tôi chỉ kiểm tra các lớp Swift trong trường hợp của mình, tôi đã không thử dùng Obj-c
Mikael

3
Bạn không nên thêm các tệp nhanh chóng của ứng dụng vào mục tiêu thử nghiệm của mình, nó sẽ làm cho nội dung của chúng bị trùng lặp khi chạy thử nghiệm.
Przemysław Wrzesiński

18

Một điều đáng chú ý là nếu tên mô-đun của bạn có ký tự gạch ngang trong đó -thì bạn sẽ phải tham chiếu nó với một thanh bên dưới _. Vì một số lý do, tôi nghi ngờ đây có thể là một vấn đề và đó thực sự là vấn đề của tôi.

ví dụ. @testable import Ocean-Swifttrở thành@testable import Ocean_Swift

Chỉ một điều nữa, nếu bạn sử dụng @testablecú pháp, hãy chắc chắn không bao gồm mã sản xuất của bạn trong mục tiêu thử nghiệm. Tôi đã tìm thấy điều này sẽ gây ra sự kỳ lạ không thể giải thích.


1
tất cả các ký tự không chữ và số cũng có thể cần được thay thế bằng dấu gạch dưới. Mục tiêu của tôi là ở định dạng này App (Dev), Mô-đun có thể kiểm tra đã trở thànhApp__Dev_
embedcraft

11

Điều này có vẻ là một lỗi với cài đặt xây dựng của cả hai mục tiêu. Bạn cần đảm bảo rằng:

  • ENABLE_TESTABILITY bằng Có cho cả hai mục tiêu.
  • Các PRODUCT_MODULE_NAMEgiá trị của mục tiêu thử nghiệm nên phân biệt với một trong những ứng dụng.

2
Điều này làm việc cho tôi. Tôi đã sử dụng tên mô-đun sai. Tôi đã xóa khoảng trắng thay vì thêm _. NHÂN ĐÔI KIỂM TRA MÔ HÌNH SẢN PHẨM CỦA BẠN TÊN TRONG
THIẾT LẬP

9

Một điều khác cần kiểm tra: Nếu bạn có dự án Objective-C, nhưng đang viết bài kiểm tra đơn vị trong Swift, hãy đảm bảo mục tiêu chính sử dụng ít nhất một tệp Swift!


Thêm thông tin:

Tôi đang làm việc trong một dự án Objective-C, nhưng muốn viết các bài kiểm tra đơn vị trong Swift.

Tôi đã thêm một tệp Swift vào mục tiêu chính để tạo tệp ProjectName-Bridging-Header.h cần thiết, đã viết các bài kiểm tra của tôi và mọi thứ đều hoạt động bình thường.

Sau đó, tôi đã xóa tệp Swift vì tôi nghĩ rằng tôi không cần nó (tất cả mã của mục tiêu chính là trong Objective-C ... Tôi chỉ viết các bài kiểm tra trong Swift).

Tôi đã không nhận thấy một vấn đề nào cho đến sau này, sau khi tôi thực hiện "thư mục xây dựng sạch / sạch" và vấn đề "Không có mô-đun như vậy" xuất hiện. Sau khi gãi đầu, tôi đã thêm một tệp Swift trống mới và vấn đề đã biến mất.

Tôi đã thử nghiệm nó nhiều lần với / không có tệp Swift và nó chỉ hoạt động với nó ... vì vậy, tôi sẽ cần phải để lại tệp trống trong dự án, chuyển đổi một số Objective-C thành Swift hoặc thêm một số mã mới cho dự án được viết bằng Swift.


1
!! Sau 3 giờ dọn dẹp xóa dữ liệu bị mất, làm sạch, bắt đầu lại từ đầu 3 lần, tôi thấy bình luận của bạn đã giải quyết vấn đề của tôi !!! Cảm ơn !!!!
Maryam Fekri

Bạn có biết cách truy cập các lớp Objective-C trong các lớp kiểm tra Swift không, vì tôi nhập mô-đun dự án và không có lỗi với điều đó, nhưng nó vẫn không nhận ra các lớp Objective-C của tôi. Tôi nên làm gì nữa?
Maryam Fekri

Một điểm bổ sung tôi muốn thêm vào, mặc dù dự án ObjC chủ yếu của tôi có ít nhất một tệp Swift không có tiêu đề bắc cầu cho mục tiêu của tôi. Làm theo các hướng dẫn tại liên kết sau dưới tiêu đề "Nhập mã trong mục tiêu ứng dụng" đã giải quyết khả năng truy cập các lớp ObjC từ các bài kiểm tra Swift. developer.apple.com/documentation/swift/ từ
palmi

Tôi gặp vấn đề này. Tuy nhiên, tôi muốn tìm cách tránh bao gồm tệp Swift nếu có thể, vì vậy tôi đã đặt câu hỏi tại đây: stackoverflow.com/q/62965954/211292
ThomasW

Trên thực tế, có vẻ như nếu bạn không bao gồm @testable import Foodòng, bài kiểm tra đơn vị của bạn sẽ chạy chính xác.
ThomasW

9

Đối với những người đã cuộn cho đến câu trả lời cuối cùng mà vẫn không có gì hiệu quả, đây là những gì đã làm cho tôi sau khi làm theo tất cả các lời khuyên câu trả lời khác. Tôi đang sử dụng Xcode 11:

Điều gây ra vấn đề trong trường hợp của tôi là tôi đã thay đổi Tên sản phẩm của mình

  1. Tôi đã thay đổi Tên sản phẩm của mình trong Cài đặt bản dựng của mục tiêu chính thành "Tên mới"
  2. Tôi đã phải chọn lại Ứng dụng máy chủ cho mục tiêu thử nghiệm của mình
  3. Tôi không biết rằng việc thay đổi tên sản phẩm cũng sẽ thay đổi Tên Mô-đun sản phẩm , đó là tên được sử dụng để nhập mô-đun trong các tệp thử nghiệm của tôi. Tôi đã thay đổi nhập khẩu của mình như sau:

    @testable nhập New_Name

  4. Nó đã làm việc

Tôi hy vọng nó sẽ giúp


7

Sau khi dành vài ngày cho vấn đề này, cuối cùng tôi cũng làm được với dự án của mình. Vấn đề nằm ở Bridging Header - đường dẫn trong mục tiêu Thử nghiệm không thể để trống nếu bạn đang sử dụng Bridging Header trong mục tiêu chính của mìnhCầu nối tiêu đề không thể để trống !!!

Hy vọng nó sẽ tiết kiệm thời gian cho một ai đó.


5

Đảm bảo trong cài đặt bản dựng của sơ đồ kiểm tra, mục tiêu kiểm tra nằm trong danh sách.

Bên cạnh nút phát, chọn lược đồ kiểm tra, sau đó Chỉnh sửa lược đồ ..., đi đến phần Xây dựng, nhấp vào dấu cộng + và chọn mục tiêu bạn muốn kiểm tra.

Trong trường hợp của tôi, chúng tôi có một mục tiêu nội bộ mà chúng tôi phát triển với (một vài khác biệt nhỏ) và sau khi hợp nhất, nó đã bị xóa khỏi cấu hình thử nghiệm.

Chỉnh sửa sơ đồ kiểm tra


5

Đây là một điều khác để kiểm tra mà không được liệt kê. Đối với tôi, nó có liên quan đến nhóm của tôi, có lẽ vì Đại lý của Nhóm chúng tôi chưa đồng ý với Thỏa thuận cấp phép mới nhất! Khi tôi đã chọn một Nhóm khác trong cài đặt Chung của Mục tiêu, VÀ sau đó tôi đã chỉ định một Mục tiêu triển khai cụ thể như 12.1 hoặc 11.0, đột nhiên cảnh báo "Không có mô-đun như vậy" biến mất.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


4

Trong trường hợp của tôi, tôi đã có 3 vấn đề. Đầu tiên là tôi phải chỉ định đường dẫn nhập trong:

Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths

Thứ hai là tôi đã sử dụng Pods và tôi cũng phải nhập các nhóm này vào các thử nghiệm của mình bằng cách sử dụng:

target 'MyAppTests' do
    inherit! :complete
end

Cái thứ ba mà tôi đang sử dụng một tiêu đề bắc cầu trong mục tiêu của mình, do đó tôi phải chỉ định tiêu đề bắc cầu là giống nhau cho thử nghiệm.


2

Vấn đề của tôi là lớp tôi muốn kiểm tra được cho là nằm trong một mô-đun riêng (API Client), nhưng lớp thực sự là một thành viên của mục tiêu ứng dụng chứ không phải mục tiêu khung. Thay đổi thành viên mục tiêu của lớp đã làm cho lỗi nhập biến mất!


2

Môi trường: Xcode Phiên bản 9.0 (9A235)
Kịch bản: Kiểm tra khung nguồn mở.

Tôi đã có cùng một vấn đề: 'Không có mô-đun như vậy'.

Giải pháp:

  1. Chọn mục tiêu thử nghiệm.
  2. Chọn giai đoạn xây dựng
  3. Thêm khung để được kiểm tra thông qua Liên kết nhị phân ...

nhập mô tả hình ảnh ở đây

Đây là tập tin thử nghiệm: nhập mô tả hình ảnh ở đây


2

tôi đã có vấn đề tương tự. Làm sạch thư mục bản dựng và khởi động lại Xcode không hoạt động.

Điều đã làm với tôi là đảm bảo rằng cài đặt cho "Chỉ xây dựng kiến ​​trúc hoạt động" của mục tiêu và sơ đồ thử nghiệm của bạn phù hợp với cài đặt của mục tiêu và sơ đồ của ứng dụng.


2

Tôi làm theo các bước trên, mà làm việc. Tuy nhiên, dự án của tôi đã có một số vấn đề hơn. Tôi đã nhận được cảnh báo này và tôi không thể truy cập các lớp từ dự án chính của mình để kiểm tra trong mục tiêu thử nghiệm của mình.

Kiểm tra một phần của mô-đun - bỏ qua nhập khẩu

Tôi thấy rằng Tên mô-đun sản phẩm mục tiêu thử nghiệm của bạn (YourTestTarget -> Build Settings -> tìm kiếm product module) không thể cùng tên với tên dự án của bạn.

Tên mô-đun sản phẩm cho mục tiêu thử nghiệm không thể cùng tên với tên dự án của bạn

Khi tôi thay đổi Tên Mô-đun Sản phẩm cho mục tiêu thử nghiệm của mình, mọi thứ đều hoạt động.

nhập mô tả hình ảnh ở đây


1

Giải pháp của tôi là đây.

Đầu tiên, nhấp vào OdeAlSwiftUITest.swift, sau đó kiểm tra Project TargetName trong tư cách thành viên mục tiêu.

nhập mô tả hình ảnh ở đây


7
Cái này sai. Không bao giờ thêm các tập tin thử nghiệm của bạn vào mục tiêu của bạn.
cườiBot

1

nhập mô tả hình ảnh ở đây

Nhấp vào MyAppTests.swift trong trình điều hướng dự án và nhấp vào bảng bên phải, kiểm tra mô-đun của bạn trong Tư cách thành viên mục tiêu. Nó hoạt động trong tôi.


1

Tôi đã thử tất cả các câu trả lời ở đây nhưng cờ đỏ sẽ không biến mất. Nhưng tôi đã làm cho nó hoạt động bằng cách chỉ "chạy" một bài kiểm tra trống bất kể và nó đã bị xóa.

Những điều tôi muốn chắc chắn được thực hiện:

  • Ứng dụng máy chủ
  • @testable nhập "Module_name" (đảm bảo tên mô-đun là chính xác)
  • Hãy chắc chắn rằng mục tiêu triển khai của bạn cho thử nghiệm giống như dự án
  • XCTest không cần phải có thành viên Target

0

Đối với tôi, giải pháp là đổi tên @testable nhập myproject_ios thành @testable nhập myproject sau khi tôi đã cập nhật tên sản phẩm của myproject-ios trong Cài đặt xây dựng / Bao bì / Tên sản phẩm / từ $ {TARGET_NAME} thành myproject.


0

Điều này đã được sửa cho tôi khi tôi thay đổi Mục tiêu triển khai từ 9.3 thành 11.0.

Chung> Mục tiêu triển khai> "11.0"


đây có thể là trường hợp thay đổi giả lập nhưng điều này cũng hiệu quả với tôi
RolandasR

0

Nếu bạn đang sử dụng xcodebuild và tìm thấy vấn đề này, hãy xem xét thêm vào cờ không gian làm việc vào lệnh xây dựng.

Thay đổi này

$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test

Để điều này

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test

0

Trong mục tiêu kiểm tra cài đặt bản dựng, hãy kiểm tra kiểm tra máy chủ, nó sẽ đặt tên được đặt trong PRODUCT_NAME. Đó là tên mà bạn nên sử dụng trong các lớp kiểm tra.

Tôi khuyên bạn không nên thay đổi PRODUCT_NAME (tên trùng khớp của mục tiêu chính)



-1

Như được mô tả trong câu trả lời này, tôi đã thêm các thử nghiệm Swift vào một dự án chỉ Obj-C. Giải pháp là thêm một lớp Swift giả, sau đó Xcode sẽ nhắc thêm tiêu đề bắc cầu, sau đó xóa lớp Swift. Tất cả đều ổn sau đó.


-1

Tôi ngoài những thứ khác được liệt kê, tôi phải thêm tệp với lớp mà tôi đang cố kiểm tra các nguồn biên dịch của mình cho mô-đun kiểm tra đơn vịnhập mô tả hình ảnh ở đây


-1

Tôi nghĩ điều này có thể đã xảy ra vì tôi đã xóa các bài kiểm tra mẫu.

Tôi đã gỡ bỏ gói thử nghiệm Đơn vị sau đó thêm lại nó như trong các hình ảnh bên dưới và tất cả đã hoạt động tốt trở lại.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

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.