Быстрое модульное тестирование: имя модуля класса объекта приводит к сбою проверки типа - PullRequest
2 голосов
/ 19 апреля 2019

У меня были модульные тесты в моем проекте в течение пары недель, и они до сих пор работали нормально.

Один из моих новых модульных тестов создает один из моих пользовательских контроллеров представления.Указанный контроллер представления создает и добавляет подпредставление типа CoolSearchBar, класса, который я создал сам (как файл .swift, так и файл .xib).

В указанном контроллере представления я загружаю этот экземпляр CoolSearchBarпрограммно, перед добавлением его в иерархию представлений, например:

guard let searchBar = Bundle.main.loadNibNamed(String(describing: CoolSearchBar.self), owner: nil, options: nil)?.first as? CoolSearchBar else {
    fatalError("Search bar could not be loaded from nib")
}

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

Однако,когда я запускаю свои модульные тесты, появляется фатальная ошибка в приведенном выше коде.Я немного покопался и обнаружил, что причина ошибки заключается в том, что одно имя класса (CoolSearchBar) не рассказывает всей истории.

В частности, я использовал NSStringFromClass, чтобы получить более подробныйописания классов объектов, которые я сравниваю.По сути, создаваемый xib оценивается по типу класса:

MyApp.CoolSearchBar

Но класс, с которым проверяется (часть as? CoolSearchBar), оценивает:

MyAppTests.CoolSearchBar

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

Спасибо, и, пожалуйста, прокомментируйте, если вам нужна дополнительная информация.

1 Ответ

1 голос
/ 19 апреля 2019

Вы, вероятно, также добавили CoolSearchBar к своей цели теста. Снимите флажок со своего целевого членства в CoolSearchBar. Если вы хотите получить доступ к классу из основного приложения вашего тестового проекта, импортируйте его, добавив:

@testable import myApp

enter image description here

Примечание:

Как заметил Брайан Сашетта. Как только класс удален из целевого членства, все остальные, использующие этот класс, начнут жаловаться. Поэтому все классы из основного проекта, добавленные в тестовое целевое членство, должны быть удалены из этого членства.

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