У меня есть вспомогательный метод в моих модульных тестах:
func expect(_ sut: CompanyStore, toRetrieve expectedResult: RetrieveCacheResult, when action: @escaping (() -> Void), file: StaticString = #file, line: UInt = #line) {
let exp = expectation(description: "await completion")
sut.retrieve { retrievedResult in
switch (expectedResult, retrievedResult) {
case (.empty, .empty), (.failure, .failure):
break
case let (.found(retrieved), .found(expected)):
XCTAssertEqual(retrieved.item, expected.item, file: file, line: line)
XCTAssertEqual(retrieved.timestamp, expected.timestamp, file: file, line: line)
default:
XCTFail("Expected to retrieve \(expectedResult), got \(retrievedResult) instead", file: file, line: line)
}
exp.fulfill()
}
action()
wait(for: [exp], timeout: 1.0)
}
Это позволяет мне создавать такие тесты, как:
func test_retrieve_delivers_empty_on_empty_cache() {
let sut = makeSUT()
expect(sut, toRetrieve: .empty, when: {
// some action to perform
})
}
После обновления до Swift 5.1 я получаю следующее предупреждение:
Невозможно сопоставить несколько связанных значений одновременно, неявно присвоить связанные значения и попытаться сопоставить это вместо этого
В следующей строке
case let (.found(retrieved), .found(expected)):
Эти значения являются кортежем (item: LocalCompany, timestamp: Date)
Мне не удалось понять, как очистить это предупреждение.
Редактировать:
.found
- это enum:
public enum RetrieveCacheResult {
case empty
case found(item: LocalCompany, timestamp: Date)
case failure(Error)
}