Version License Platform

差异

更好地区分两个实例之间差异的方法。

你写过测试吗?通常测试会使用相等断言,例如 XCTAssertEqual。如果对象不相等会发生什么?Xcode 会抛给你一大堆文本。

这迫使你手动扫描文本并试图找出具体哪里出错了。如果可以直接知道哪个属性不同呢?

如果你想支持我的工作并改进你的工程工作流程,请查看我的 SwiftyStack 课程

安装

CocoaPods

pod 'Difference' 添加到你的 Podfile。

Carthage

github "krzysztofzablocki/Difference" 添加到你的 Cartfile。

SwiftPM

在你的 Package manifest 文件中添加 .package(url: "https://github.com/krzysztofzablocki/Difference.git", branch: "master") 依赖。

使用 lldb

写入以下内容以查看两个实例之间的差异

po dumpDiff(expected, received)

与 XCTest 集成

将其添加到你的测试目标

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

与 Quick 集成

将其添加到你的测试目标

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 集成

如果你正在使用 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