Прервать прерывание 6 при добавлении расширения к внешней зависимости - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь добавить расширение для зависимости в целях тестирования.Зависимость - это класс, помеченный как final, и я хотел бы создать протокол, имитирующий интерфейс, чтобы я мог поменять реальную реализацию на фиктивный объект в моих тестах.В настоящее время я получаю ошибку прерывания прерывания 6 при построении моих тестов, если расширение включено в мой проект.Без расширения проект создается без ошибок, но я не могу передать свою зависимость в качестве протокола, который не позволяет мне заменять его на фиктивный объект в моих тестах.Поскольку класс помечен как окончательный, я не могу подклассифицировать объект, чтобы добавить к нему свой протокол.

Я добавил 3 объекта, чтобы разрешить такое поведение:

RealmProtocol.swift : это протокол, имитирующий открытый интерфейс объекта Realm (моя внешняя зависимость, но это не относится к Realm).

import RealmSwift

protocol RealmProtocol {
    func add(_ object: Object, update: Bool)
    func beginWrite()
    func commitWrite(withoutNotifying tokens: [NotificationToken]) throws
    func object<Element: Object, KeyType>(ofType type: Element.Type, forPrimaryKey key: KeyType) -> Element?
    func objects<Element: Object>(_ type: Element.Type) -> Results<Element>
}

MockRealm.swift : этомой фиктивный объект для Realm.swift.В производстве будет использоваться объект Realm, в моих тестах он будет заменен MockRealm, поэтому я могу убедиться, что правильный метод вызывается в нужное время.

import Foundation
import RealmSwift

@testable import RealmObjectMocking

class MockRealm: RealmProtocol {
    var addCalled = false
    var beginWriteCalled = false
    var commitWriteCalled = false
    var objectCalled = false
    var objectsCalled = false

    var objectReturn: Any?

    func add(_ object: Object, update: Bool) {
        addCalled = true
    }

    func beginWrite() {
        beginWriteCalled = true
    }

    func commitWrite(withoutNotifying tokens: [NotificationToken]) throws {
        commitWriteCalled = true
    }

    func object<Element: Object, KeyType>(ofType type: Element.Type, forPrimaryKey key: KeyType) -> Element? {
        objectCalled = true
        let object = objectReturn as? Element
        return object
    }

    func objects<Element: Object>(_ type: Element.Type) -> Results<Element> {
        objectsCalled = true
        let realm = try! Realm()
        return realm.objects(type)
    }
}

Realm.swift : Это расширение объекта Realm, чтобы оно соответствовало моему протоколу.Без этого файла в проекте он строит без ошибок.С учетом этого я получаю прерывание прерывания 6. Реализация пуста, так как мой протокол соответствует существующим публичным методам объекта Realm.

import RealmSwift

extension Realm: RealmProtocol {}

Я не уверен, является ли это проблемой с расширениемкласс, помеченный как final, или если я получаю какую-то круговую зависимость здесь, или, может быть, другую проблему.Многие посты рекомендовали отключить оптимизацию, чтобы обойти эту ошибку, но это не помогло.Кроме того, открытие файла MockRealm.swift, когда расширение класса включено в проект, приводит к сбою редактора.Из-за этого я также подал Радар для этой проблемы.

Вот ссылка на пример проекта, который показывает проблему.Код в примере приложения идентичен приведенному выше коду: https://github.com/skladek/RealmObjectMocking

1 Ответ

0 голосов
/ 11 июня 2018

Похоже, что это ошибка XCode, а не проблема реализации.Разработчик Apple сказал мне, что это исправлено в Xcode10-Beta 1. Я протестировал и подтвердил.Поскольку мой продукт запустится после выхода Xcode 10 и iOS 12, я доволен, оставив все как есть.

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