更好地区分两个实例之间差异的方法。
你写过测试吗?通常测试会使用相等断言,例如 XCTAssertEqual
。如果对象不相等会发生什么?Xcode 会抛给你一大堆文本。
这迫使你手动扫描文本并试图找出具体哪里出错了。如果可以直接知道哪个属性不同呢?
如果你想支持我的工作并改进你的工程工作流程,请查看我的 SwiftyStack 课程
将 pod 'Difference'
添加到你的 Podfile。
将 github "krzysztofzablocki/Difference"
添加到你的 Cartfile。
在你的 Package manifest 文件中添加 .package(url: "https://github.com/krzysztofzablocki/Difference.git", branch: "master")
依赖。
写入以下内容以查看两个实例之间的差异
po dumpDiff(expected, received)
将其添加到你的测试目标
public func XCTAssertEqual<T: Equatable>(_ expected: @autoclosure () throws -> T, _ received: @autoclosure () throws -> T, file: StaticString = #filePath, line: UInt = #line) {
do {
let expected = try expected()
let received = try received()
XCTAssertTrue(expected == received, "Found difference for \n" + diff(expected, received).joined(separator: ", "), file: file, line: line)
}
catch {
XCTFail("Caught error while testing: \(error)", file: file, line: line)
}
}
如果你使用的是 Xcode 11 或更早版本,请将 #filePath
替换为 #file
。
将其添加到你的测试目标
public func equalDiff<T: Equatable>(_ expectedValue: T?) -> Predicate<T> {
return Predicate.define { actualExpression in
let receivedValue = try actualExpression.evaluate()
if receivedValue == nil {
var message = ExpectationMessage.fail("")
if let expectedValue = expectedValue {
message = ExpectationMessage.expectedCustomValueTo("equal <\(expectedValue)>", actual: "nil")
}
return PredicateResult(status: .fail, message: message)
}
if expectedValue == nil {
return PredicateResult(status: .fail, message: ExpectationMessage.fail("").appendedBeNilHint())
}
return PredicateResult(bool: receivedValue == expectedValue, message: ExpectationMessage.fail("Found difference for " + diff(expectedValue, receivedValue).joined(separator: ", ")))
}
}
写入以下内容以查看两个实例之间的差异:expect(received).to(equalDiff(expected))
如果你正在使用 The Composable Architecture 的 nameLabels
配置来获得更适合 reducer 仪表化的差异
diff(oldState, newState, indentationType: .pipe, nameLabels: .comparing)
你可以在你自己的 ReducerInstrumentation 代码变体中使用此函数
这样你的差异会看起来更像这样
Received action:
AppAction.home(.howTo(.setSelectedSlide))
State:
home:
| selectedHowTo:
| | selectedSlide:
| | | Current: 8mnkni91h4fe
| | | Previous: exei4wpqsmdk