2012-07-31 10 views
9

Tôi đã theo dõi this great article để tham gia Kiểm tra đơn vị về Dữ liệu lõi. Các thiết lập có vẻ đơn giản và chỉ liên quan đến một số dòng xem mã.Làm thế nào tôi có thể yêu cầu MagicalRecord không sử dụng Dữ liệu cốt lõi dựa trên tệp nhưng trong thiết lập bộ nhớ?

- (void)setUp; 
{ 
    [MagicalRecord setDefaultModelWithClass:[self class]]; 
    [MagicalRecord setupCoreDataStackWithInMemoryStore]; 
} 

- (void)tearDown; 
{ 
    [MagicalRecord cleanUp]; 
} 

- (void)testSomeCalculationOnMyEntity; 
{ 
    NSNumber *count = [MyEntity MR_numberOfEntities]; 
    // STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation"); 
} 

@end 

Vấn đề là, rằng mỗi khi tôi ví dụ séc cho số tiền của các tổ chức trong trong bộ nhớ thiết lập của Core Data bằng cách gọi [MyEntity MR_numberOfEntities] (như trên), tôi nhận được tiền của các đối tượng, trong đó được lưu trữ trong thiết lập dựa trên tệp là một vài nghìn đối tượng. Điều này xảy ra như thế nào? Tôi có nghĩa là dòng thứ hai trong setUp cho biết trong một bộ nhớ, phải không? Và trường hợp này sẽ trả về 0 là số lượng đối tượng được lưu trữ.

Cảm ơn mọi đề xuất!

Edit:

@casademora đưa tôi đi đúng hướng. Các thiết lập công trình sau đây hoạt động tốt cho tôi ngay bây giờ.

- (void)setUp; 
{ 
    [MagicalRecord cleanUp]; // This solved the mystery. 

    // I don't now why I had to remove this line, though. 
    // [MagicalRecord setDefaultModelWithClass:[self class]]; 

    [MagicalRecord setupCoreDataStackWithInMemoryStore]; 
} 

- (void)tearDown; 
{ 
    [MagicalRecord cleanUp]; 
} 

- (void)testSomeCalculationOnMyEntity; 
{ 
    NSNumber *count = [MyEntity MR_numberOfEntities]; 
    // STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation"); 
} 

@end 

Trả lời

1

Phương pháp được sử dụng để thiết lập Dữ liệu cốt lõi ở đây không bao giờ nên tải kho lưu trữ tệp. Nếu bạn bước vào nó bằng cách sử dụng trình gỡ lỗi, bạn sẽ thấy rằng nó khởi tạo một điều phối viên lưu trữ liên tục bằng cách sử dụng loại NSInMemoryStore ... cuối cùng.

Tôi đoán tại sao điều này xảy ra có thể là do bạn không thêm cuộc gọi dọn dẹp vào trường hợp kiểm tra trước đó, khiến ngăn xếp dữ liệu cốt lõi trước đó hoặc lưu trữ lâu dài, tham gia thử nghiệm này.

Đây là thiết lập mã chính xác mà tôi sử dụng cho dữ liệu lõi thử nghiệm đơn vị mọi lúc và nó chưa bao giờ tải kho lưu trữ liên tục không mong muốn cho tôi. Khi bạn gỡ lỗi vào phương pháp, hãy đảm bảo chạy lệnh này:

po [self persistentStores] 

Khi bạn tải đến điều phối viên lưu trữ liên tục. Nếu có các cửa hàng hiện có, điều này ít nhất sẽ xác minh rằng có một số cửa hàng đã tồn tại từ trước.

+0

Cảm ơn câu trả lời của bạn. Bài kiểm tra tôi đang chạy là bài kiểm tra duy nhất. Mục tiêu của các Bài kiểm tra của tôi phụ thuộc vào Mục tiêu của Đơn đăng ký của tôi. Trong AppdDelegate của tôi, tôi thiết lập ngăn xếp dữ liệu cốt lõi để sử dụng một tệp. Nó có thể được rằng một trong những này được nạp trước khi thử nghiệm, và rằng nó được sử dụng do đó thay vì mới trong bộ nhớ một? Nếu có, tôi làm cách nào để tránh điều này? – Aufwind

+0

Cảm ơn bạn đã cho tôi đi đúng hướng. Tôi đã giải quyết bí ẩn này bằng cách gọi '[MagicalRecord cleanUp];' ngay trước khi '[MagicalRecord setupCoreDataStackWithInMemoryStore];' trong phương thức '- (void) setUp;'. Tôi đã phải loại bỏ '[MagicalRecord setDefaultModelFromClass: [self class]];'. Xem chỉnh sửa của tôi về câu hỏi. – Aufwind

+0

Chà, điều đó không cần thiết ... gọi cleanUp trong phương thức tearDown là đủ rồi. Điều này khá kỳ quặc. – casademora

1

Bạn cũng có thể thêm thông tin sau được thực hiện một lần khi khởi tạo lớp. Điều này làm việc cho tôi.

+(void)setUp 
    { 
      [MagicalRecord cleanUp]; 
    }