Продолжение ответа @ eduardo-costa, который я принял, с кодом, который я использовал для его работы.
Сначала я создал класс DAO и переместил туда все основные свойства данных. Файл .h выглядит так:
@interface CollectionsDAO : NSObject
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
+ (CollectionsDAO *)defaultDAO;
@end
Теперь я просто использую этот класс везде, где мне нужно, чтобы получить доступ к своим основным данным. -defaultDAO
возвращает статический экземпляр класса, так что я могу использовать его везде. Чего вы не видите, так это частного метода экземпляра -storeType
, который возвращает NSSQLiteStoreType
. Это используется для создания магазина. Я вернусь к этому ниже.
Далее я создал категорию для этого класса для использования в тестах. Заголовочный файл:
#import "CollectionsDAO.h"
@interface CollectionsDAO (Test)
+ (void)setupTestDAO;
+ (void)clearData;
@end
И реализация:
#import "CollectionsDAO+Test.h"
#include <objc/runtime.h>
static CollectionsDAO *testDAO;
@implementation CollectionsDAO (Testing)
+ (CollectionsDAO *)testDAO {
if (testDAO == nil) testDAO = [[self alloc] init];
return testDAO;
}
+ (void)setupTestDAO {
method_setImplementation(
class_getClassMethod(self.class, @selector(defaultDAO)),
method_getImplementation(class_getClassMethod(self.class, @selector(testDAO)))
);
}
+ (void)clearData {
testDAO = nil;
}
- (NSString *)storeType {
return NSInMemoryStoreType;
}
@end
Обратите внимание, что -storeType
заменяет закрытый метод с тем же именем по умолчанию, возвращая NSInMemoryStoreType
, так что данные будут храниться в памяти.
Теперь, в моем базовом классе тестирования, я просто использую эту категорию следующим образом:
#import "CollectionsDAO+Test.h"
@implementation AppTestBase
+ (void)initialize {
if (self == AppTestBase.class) {
[CollectionsDAO setupTestDAO];
}
}
- (void)tearDown {
[CollectionsDAO clearData];
}
@end
И теперь тест всегда использует память для хранения данных ядра, экземпляр теста DAO всегда возвращается +defaultDAO
(потому что +setupTestDAO
меняет его на место), и данные ядра очищаются после каждого теста.
Я думаю, что это много чище, чем у меня было раньше. Мне потребовалось некоторое время, чтобы выяснить это, но ответ Эдуардо был правильным, мне просто пришлось поработать над этим некоторое время, чтобы выяснить детали.