ios - XCTAssertThrows 在断点处停止

标签 ios xctest

我正在编写一个测试方法,我希望 SUT 在特定条件下抛出异常。代码如下所示:

- (void) testCantStartTwice
{
    XCTAssertThrows([self.sut start], @"");
}

现在,一切都很好,测试通过了。但是,我让 Xcode 为所有 ObjC 异常设置了一个异常断点,这在调试器中测试应用程序时非常有用。就像您现在一样,现在当我使用 ⌘U 执行我的测试套件时,现在它会在该测试处停止并且看起来好像它失败了,即使它说“测试成功”。

有什么方法可以使断点在该测试中不停止

谢谢,祝一切顺利

最佳答案

不幸的是,似乎不可能让异常断点忽略 XCTAssertThrows 中包含的任何内容(或现在 XCTAssertThrowsError )。

解决方法 1:处理断点或断点周围的脚本

执行这些测试时,您可以执行以下操作:

  • 禁用异常断点。
  • 每次遇到您的断点之一时点击运行。

两者都不理想,因为您将进行一些手动工作。

how to disable breakpoints for Swift XCTAssertThrowsError assertions here的建议.我没有测试过这些。

解决方法 2:返回 Result<T, Error>相反

我原来的方法是这样的:

struct Truck {
  static func makeTruck(numberOfWheels: Int) throws -> Self {
    if numberOfWheels < 4 {
      throw TruckError.tooFewWheels
    }

    // ...

    return .init()
  }
}

// Code example:
let truck: Truck? = try? Truck.makeTruck(numberOfWheels: 1)

// Test example:
XCTAssertThrowsError(try Truck.makeTruck(numberOfWheels: 1))

为了解决这个断点问题,我通过返回 Result 创建了一个更易于测试的重复内部函数(因为它不会导致断点问题)而不是抛出 Error .

struct Truck {
  static func _makeTruck(numberOfWheels: Int) -> Result<Truck, Error> {
    if numberOfWheels < 4 {
      return .failure(TruckError.tooFewWheels)
    }

    // ...

    return .success(.init())
  }

  static func makeTruck(numberOfWheels: Int) throws -> Self {
    switch _makeTruck(numberOfWheels: numberOfWheels) {
    case .failure(let error):
      throw error
    case .success(let value):
      return value
    }
  }
}

// Code example:
let truck: Truck? = try? Truck.makeTruck(numberOfWheels: 1)

// Test example:
XCTAssertEquals(Truck._makeTruck(numberOfWheels: 1), .error(TruckError.tooFewWheels))

解决方法 3:返回 T?相反

最后,如果您有一个更简单的用例,并且您的函数的失败非常明显(例如,它只能返回一种类型的错误),请考虑只返回一个可选的,而不需要复杂的 Result输入:

struct Truck {
  static func makeTruck(numberOfWheels: Int) -> Truck? {
    if numberOfWheels < 4 {
      return nil
    }

    // ...

    return .init()
  }
}

// Code example:
let truck: Truck? = Truck.makeTruck(numberOfWheels: 1)

// Test example:
XCTAssertNil(Truck.makeTruck(numberOfWheels: 1))

关于ios - XCTAssertThrows 在断点处停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22020527/

相关文章:

ios - 弹出窗口中的表格 View 不滚动

ios - 使用 AudioKit 将麦克风输入的声音实时转换为音符

ios - 让 indexPath = NSIndexPath(forRow : 0, inSection: 0) 的替代方法

swift - 如何对调用异步任务的 UIButton 进行单元测试

ios - 如何在 Swift 中测试自定义 UITableViewCell 的布局

ios - 如何获得两个具有多个小数位的 NSDates 之间的年份差异

ios - 我想用一个字符串来标识数组,这个字符串是我之前使用 Segue 从 View 中获得的

ios - 在 iDevice 上运行 Swift XCTests

ios - 使用 @testable 来自 XCTest 的 "Use of unresolved identifier"和 "value of type has no member"

ios - 将 XCTest 导入动态框架