Как создать общедоступные расширения в общей структуре для XCTest?

Например, я никогда не использую описание XCTestCase.expectation, поэтому я хотел бы использовать функцию для предоставления по умолчанию для нее и очистить ее, назвав, что я инициализирую это ожидание, t действительно использовать инициализатор для XCTestExpectation. Но если расширение не находится в тестовой цели, то оно не может скомпилировать:

Невозможно загрузить базовый модуль для "XCTest"

import XCTest

public extension XCTestCase {
    func makeExpectation() -> XCTestExpectation {
        return expectation(withDescription: "")
    }
}

Ответ 1

Я создал здесь xcworkspace (https://github.com/dtweston/TestFrameworkSample), который демонстрирует решение вашей проблемы. В этом рабочем пространстве есть два проекта:

  • Проект SampleApp с целевой программой iOS и целью unit test.
  • Проект SharedTestFramework, который импортирует XCTest и объявляет одно расширение, которое вы задали в своем вопросе.

Образец SampleAppTests ссылается на SharedTestFramework, чтобы иметь возможность использовать расширение, которое он определяет. Единственный файл теста импортирует SharedTestFramework.

С помощью этих шагов я также сталкиваюсь с Cannot load underlying module for 'XCTest' при создании SharedTestFramework.

Исправление для этого - обновить Framework Search Paths, чтобы включить "$(PLATFORM_DIR)/Developer/Library/Frameworks". Теперь SharedTestFramework компилируется правильно, и, как вы можете видеть в рабочей области, которую я загрузил, TargetAppTests может использовать ее успешно.

Старый ответ и busted

Вы создаете отдельную структуру, предназначенную для импорта в тестовые объекты? Если это так, то мне кажется, вам просто нужно ссылаться на XCTest.framework из этой настраиваемой структуры, которую вы создаете.

С другой стороны, если вы пытаетесь добавить это расширение в фреймворк, который используется целевой вами приложением, это кажется плохой идеей, потому что это будет означать ссылку XCTest.framework на двоичный файл, который отправляется на хранить и запускать на устройствах людей.

Я не уверен, что это возможно. Я уверен, что это не сценарий, который Apple ожидает или поддерживает.