Как использовать оператор «is» для проверки соответствия модуля Equatable в Swift - PullRequest
1 голос
/ 16 мая 2019

Поскольку мы можем использовать «is» для проверки соответствия протокола, есть ли способ провести модульное тестирование соответствия Equatable с помощью оператора «is»? Что-то вроде:

struct Thing {
    var id: UUID
}

extension Thing: Equatable {
    static func ==(lhs: Thing, rhs: Thing) -> Bool {
        return lhs.id == rhs.id
    }
}



func test_ThingConformsToEquatable() {
    let thing1 = Thing(id: UUID())
    XCTAssert(thing1 is Equatable)
}

Это приводит к тому, что «Протокол« Equatable »может использоваться только как общее ограничение, потому что он имеет требования к Self или связанные с типами», и я прочитал обходные пути для этой ошибки в SO, но оператор «is» очень чистый , и я хотел бы найти способ модульного тестирования на соответствие, используя его. Спасибо!

1 Ответ

4 голосов
/ 16 мая 2019

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

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

func isEquatable<T: Equatable>(_: T) -> Bool {
    return true
}

func test_ThingConformsToEquatable() {
    let thing1 = Thing(id: UUID())
    XCTAssert(isEquatable(thing1))
}

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

Вы также можете пропустить создание экземпляра и просто протестировать тип напрямую:

func isEquatable<T: Equatable>(_: T.Type) -> Bool {
    return true
}

func test_ThingConformsToEquatable() {
    XCTAssert(isEquatable(Thing.self))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...