2015-04-14 16 views
7

Có một vài đối tượng về điều này, nhưng tôi chưa tìm được giải pháp nào có thể làm việc cho Swift (Xcode 6.2).Làm thế nào để kiểm tra Dữ liệu chính đúng trong Swift

Để kiểm tra các lớp dữ liệu lõi được hỗ trợ trong Swift, tôi tạo các bối cảnh đối tượng được quản lý mới mà sau đó tôi đưa vào các lớp của mình.

//Given 
let testManagedObjectContext = CoreDataTestComposer.setUpInMemoryManagedObjectContext() 
let testItems = createFixtureData(testManagedObjectContext) as [TestItem] 
self.itemDateCoordinator.managedObjectContext = testManagedObjectContext 

//When 
let data = self.itemDateCoordinator.do() 

//Then 
XCTAssert(data.exists) 

Sự cố xuất phát từ việc chuyển MOC được tạo trong bài kiểm tra cho lớp đang làm. Vì các lớp thực thể được đặt tên không gian, nên Core Data sẽ không tìm nạp lớp con ManagedObject thích hợp của bạn và thay vào đó hãy quay lại một tập hợp NSManagedObject. Khi lặp hoặc làm bất cứ điều gì với các đối tượng này (trong lớp của bạn sẽ là một mảng các mục kiểm tra ([TestItem]).

Ví dụ, lớp vi phạm ItemDateCoordinator sẽ thực hiện vòng lặp này (sau khi kéo dữ liệu liên quan từ NSFetchRequest) "

for testItem in testItems { 
    testItem.doPart(numberOfDays: 10) 
} 

sẽ cho kết quả:

fatal error: NSArray element failed to match the Swift Array Element type

Ngoài ra, tôi đã đi qua một tập hợp các thông tin mà không nhiều của một câu trả lời chắc chắn:

  • Để truyền thực thể khi tạo chúng, tôi đã sử dụng giải pháp theo Jesse, nhưng điều đó không hoạt động trên phạm vi thử nghiệm lớn hơn.
  • A solution has been posted on another question có liên quan đến việc trao đổi các lớp trong thời gian chạy, nhưng điều đó đã không làm việc cho tôi với thừa kế thực thể.
  • Có phương pháp nào khác để kiểm tra đối tượng của bạn bằng Dữ liệu cốt lõi trong trường hợp này không? Bạn làm nó như thế nào?
+0

Bạn đang phải đối mặt với một vấn đề mỉa mai? –

Trả lời

10

Tôi sắp hướng bạn tới Swift, Dữ liệu cốt lõi và thử nghiệm đơn vị nhưng thấy bạn đã tìm thấy nó. :)

Bài đăng đó không giải thích nhiều về nơi tệp của bạn sẽ tồn tại (tức là, trong đó Mục tiêu). Bạn không được thêm NSManagedObject các lớp con (hoặc bất kỳ tệp nào thực sự) thành cả hai mục tiêu. Tôi đã thấy rằng điều này dẫn đến tất cả các loại khó phát hiện lỗi và lỗi khó hiểu.

chắc chắn KHÔNG do this. Đó là một hack khủng khiếp.

Thay vào đó, hãy đặt các lớp của bạn ở chế độ công khai và import MyAppTarget trong các tệp XCTestCase của bạn. Tốt hơn hết, mô hình của bạn phải ở trong khuôn khổ riêng của mình như tôi đã đề cập trong số talk gần đây của tôi (một video sẽ được đăng trong vài tuần trên realm.io). Làm điều này làm cho không gian tên của mô hình của bạn trở nên rất rõ ràng và dễ xử lý hơn. Sau đó, bạn cần phải import MyAppModel ở mọi nơi bạn truy cập các đối tượng được quản lý của mình.

Tôi cũng có một khung công tác mới, JSQCoreDataKit có ý định làm cho Dữ liệu cốt lõi dễ sử dụng hơn trong Swift. Một phần quan trọng của khung làm việc này là CoreDataStack mà bạn có thể khởi tạo bằng cách sử dụng một cửa hàng trong bộ nhớ cho các bài kiểm tra của mình. Có ứng dụng demo với các ví dụ và các bài kiểm tra đơn vị được nhận xét tốt.

+0

Cảm ơn bạn, đây là câu trả lời cuối cùng đã đưa tôi đến một giải pháp (Xcode 7, Swift 2). Thêm các tệp lớp con NSManagedObject của bạn vào mục tiêu chính, chứ không phải mục tiêu kiểm tra. Tôi thấy nó không cần thiết để làm cho họ công khai (tôi nghĩ rằng đây là một sự thay đổi Xcode 7). Ở đầu tệp thử nghiệm của tôi, tôi đã thêm: @testable import MY_MODULE_NAME. – SarahR

+0

Giải quyết bằng cách sử dụng @testable import ModuleName như được mô tả ở đây; https://www.natashatherobot.com/swift-2-xcode-7-unit-testing-access/ –

2

Tôi tin rằng điều này đã được cập nhật gần đây (iOS 9/Swift 2.0) để có từ khóa có thể kiểm tra trên một mục tiêu đã nhập, nghĩa là các lớp nội bộ của mục tiêu (mặc định) trở thành công khai. Từ các tài liệu:

enter image description here

Vì vậy, để thêm vào jessesquires trả lời ở trên, thêm @testable nhập khẩu của bạn, và điều này sẽ giải quyết các lỗi đơn vị kiểm tra:

@testable import MyAppTarget 
+0

+1 Tôi đã sử dụng giải pháp của bạn trong dự án mẫu Swift 3.0 (https://github.com/Daemon-Devarshi /MedicationSchedulerSwift3.0/tree/master/MedicationTests), nó hoạt động liên tục :-) – Devarshi

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