2016-07-04 2 views
5

Я пытаюсь построить модульное тестирование, как так:XCTest'ing кортежа

// region is a (Double, Double) tuple 
XCTAssertEqual(region, (0.0, 200.0)) 

Но Xcode дает мне ошибку: Cannot invoke 'XCTAssertEqual' with an argument list of type ((Double, Double), (Double, Double))

Есть другой способ, чтобы проверить кортежи без извлечения их членов и тестирования индивидуально?

ответ

4

XCTAssertEqual требует, чтобы переданные ему два параметра были Equatable, которые вы можете видеть из подписи метода. Обратите внимание, что expression1 возвращает T? и T должны быть Equatable:

func XCTAssertEqual<T : Equatable>(_ expression1: @autoclosure() throws -> T?, _ expression2: @autoclosure() throws -> T?, _ message: @autoclosure() -> String = default, file: StaticString = #file, line: UInt = #line) 

Но Swift tuples aren't Equatable, так что вы не можете использовать их с XCTAssertEqual.

Кортеж сделать есть == метод - они просто не соответствуют протоколу - так что вы могли бы сделать что-то вроде этого:

let eql = region == (0.0, 200.0) 
XCTAssertTrue(eql) 

Или даже:

XCTAssertTrue(region == (0.0, 200.0)) 
+0

Я попытался 'пусть EqL = область == (0.0, 200.0) ', но он все еще дает мне ошибку, которая' == 'не может быть применена к кортежам. Я выполняю Swift 2.1.1, если это имеет значение. – GWRodriguez

+0

Я не уверен, когда они добавили его, но это относительно новое. Вам нужно будет использовать более позднюю версию Swift или проверить элементы отдельно. Я думаю, вы могли бы также написать свой собственный пользовательский оператор равенства. –

+0

В Swift 2.2 были добавлены операторы сравнения Tuple. Так как вы на 2.1, вы можете скопировать и изменить реализацию == здесь: https://github.com/apple/swift-evolution/blob/master/proposals/0015-tuple-comparison-operators.md –

3

Редактировать : Я расширил этот ответ в блоге, How to Make Specialized Test Assertions in Swift

Недостатком использования

XCTAssertTrue(region == (0.0, 200.0)) 

является неадекватной отчетности, что дает при неудаче:

XCTAssertTrue failed -

Теперь вы должны отследить, что фактические значения, чтобы понять, что пошло не так.

Но вы можете добавить диагностическую информацию к утверждению, как это:

XCTAssertTrue(region == (0.0, 200.0), "was \(region)") 

Например:

XCTAssertTrue failed - was (1.0, 2.0)

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

private func assertRegionsEqual(actual: (_: Double, _: Double), expected: (_: Double, _: Double), file: StaticString = #file, line: UInt = #line) { 
    if actual != expected { 
     XCTFail("Expected \(expected) but was \(actual)", file: file, line: line) 
    } 
} 

Теперь тест утверждение

assertRegionsEqual(actual: region, expected: (0.0, 200.0)) 

В случае отказа, это дает сообщение как

failed - Expected (0.0, 200.0) but was (1.0, 2.0)

+0

Это отличная идея, хотя она не касается моей конкретной проблемы. Это привело к тому, что тесты равенства для кортежей были введены в Swift 2.2, и я выполняю 2.1.1. Но я буду использовать это вместе с написанием собственного теста на равенство. – GWRodriguez

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

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