XCTAssertThrows在断点处停止

时间:2014-02-25 16:39:37

标签: ios xctest

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

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

现在,一切都很好,测试通过了。但是,我让Xcode为所有ObjC异常设置了一个异常断点,这在测试器中测试应用程序时非常有用。就像你现在一样,现在当我用⌘U执行我的测试套件时,现在它在那个测试中停止,看起来它是否失败,即使它显示“Test Succeeded”。

在该测试中任何使断点不停止的方法?

谢谢,一切顺利

3 个答案:

答案 0 :(得分:1)

在测试时,也许您可​​以使用测试失败断点而不是异常断点。 wwdc 2013关于单元测试的视频概述了用于检查测试失败的非常好的工作流程。它基本上说:

  1. 设置测试失败断点,允许您检查导致失败的条件。
  2. 如果需要,请在测试的早期设置手动断点并重新运行,以便您可以像往常一样逐步执行导致失败的语句。
  3. 这不是一个直接的答案,但据我所知,我认为没有办法为异常断点创建例外。希望它有所帮助

答案 1 :(得分:0)

我有同样的问题,我正在寻找2小时的解决方案。可能我们对此无能为力。

答案 2 :(得分:0)

不幸的是,似乎不可能让异常断点忽略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?

最后,如果您有一个简单的用例,并且函数的失败很明显(例如,它只能返回一种错误),请考虑只返回一个可选值,而不需要{{1 }}类型:

Result