2015-10-29 1 views
0

Итак, я обнаружил, что при написании тестов XCTests или UI я не могу получить доступ к MOC делегата моего приложения. Я получил некоторую ошибку, которая сказала: «Я - MyAppUITests, и я не могу получить доступ к материалам MyApp».Как использовать mock MOC в моем контроллере view с помощью Ucest Xcode 7?

Прохладный, без проблем, я написал весь свой код, чтобы принять любой MOC, а затем сделал mock MOC в setup(), чтобы каждый XCTest имел новый список, который не касается моих фактических данных. Импортируйте мое приложение в качестве проверяемого. Бум, все работает, мне не нужно менять цели и не писать код в моих объектах, чтобы «заставить его работать для тестирования!».

Проблема в том, что я не уверен, как это сделать для тестов пользовательского интерфейса и раскадровки. Большинство моих контроллеров просмотров получают мой MOC из appdelegate в viewdidload. Я не могу понять, как сказать ему использовать mock moc, чтобы каждый тест можно было начать чистым и чтобы он не использовал мое фактическое хранилище данных ядра, но затем также мог нормально работать, когда не тестировал. Цель здесь состоит в том, чтобы в главном коде приложения не было ссылок на него, зная, что он тестируется.

Должен быть чистый способ сделать это без получения уродливых, изменяющихся целей и т. Д. Что-то, что будет работать, как мои XCTests, но для пользовательского интерфейса. Я нашел это: How to start with empty Core Data for every UI Test Assertion in Swift?, но никто не ответил. Этот пользователь задает аналогичный вопрос, но, похоже, ошибочный подход (освобождение основных данных вместо использования Mock MOC).

Идеи?

Для чего это стоит, я создаю приложение для Mac.

ответ

0

Проблема в том, что я не уверен, как это сделать для тестов пользовательского интерфейса и с раскадровки. Большинство моих контроллеров просмотров получают мой MOC из appdelegate в viewdidload.

Одна из многих причин, по которым вы не должны использовать делегата приложения для передачи своего основного стека данных.

Не вдаваясь во все детали того, что вы должны делать, ясно одно: вы должны предоставить MOC своим контроллерам представлений.

Один простой способ (хотя и с некоторыми недостатками) состоит в том, чтобы дать вашим контроллерам вида свойство MOC.

@property (strong) NSManagedObjectContext *managedObjectContext; 

Затем вы должны установить это свойство при инициализации контроллера вида.

Один «быстрый, но грязный» способ заставить это работать для ваших тестов - добавить свойство te, а затем в ваш viewDidLoad сделайте что-нибудь подобное.

if (!self.managedObjectContext) { 
    self.managedObjectContext = appDelegate.managedObjectContext; 
} 

Это не рекомендация для делать это таким образом. Вы должны полностью избавиться от базового стека данных от делегата приложения, и вы должны передать его, как и любую модель, на контроллер представления.

Однако он позволит вашему приложению продолжать работать так, как он есть сейчас, а также предоставит вам возможность создать экземпляр ваших контроллеров представлений в тестах пользовательского интерфейса и предоставить им «макет» MOC.

Кроме того, на случай, если вы этого не сделаете, вы должны, в общем, использовать постоянное хранилище в памяти для своих тестов.

+0

В настоящее время у меня есть только один контроллер вида, поэтому мне не требуется переход между реализацией. Мой вопрос уточнен, используя функцию UITest и раскадровки, как мне снабдить контроллер вида MOC? Это легко сделать при подготовке метода segue, но поскольку тесты находятся вне приложения, я не уверен, как дать ему mock MOC при первом запуске при тестировании. UITests, похоже, не создают экземпляры контроллеров представлений, они нажимают кнопки на экране. – user5503635

 Смежные вопросы

  • Нет связанных вопросов^_^