相关疑难解决方法(0)

Swift中的单元测试fatalError

如何实现单元测试 fatalError在Swift中代码路径的?

例如,我有以下快速代码

func divide(x: Float, by y: Float) -> Float {

    guard y != 0 else {
        fatalError("Zero division")
    }

    return x / y
}
Run Code Online (Sandbox Code Playgroud)

我想在y = 0时对单元进行单元测试.

注意,我想使用fatalError而不是任何其他断言函数.

unit-testing fatal-error swift

28
推荐指数
4
解决办法
5760
查看次数

如何在iOS中为预期的assert/assertionFailure编写单元测试?

更新:

看起来这个功能应该在即将推出的Swift 2.0/XCode 7版本中得到支持,这显然将包括try/catch优点,所以这个问题可能没有实际意义.当他们没有测试版时,我会尝试相应地更新这篇文章.

原始问题:

在Swift中,虽然我假设问题/答案适用于Objective-C,但我想编写一个foo格式函数:

public class SomeClass{
  public func foo(someString:String){
    //validate someString
    assert(!someString.isEmpty, "The someString parameter cannot be empty.")
  }
}
Run Code Online (Sandbox Code Playgroud)

我使用了一个assert电话,因为我相信这是Apple推荐的,而不是抛出异常,这在其他语言中很常见.

但是,在我的单元测试中,我希望能够确保当someString参数为空字符串时函数确实失败:

class SomeClass_Tests:XCTestCase{
  func test_foo_someStringParamaterIsEmpty_error(){
    //ACTION
    let someClassInstance = SomeClass()
    someClassInstance.foo("")

    //VALIDATE
    //**What goes here?
  }
}
Run Code Online (Sandbox Code Playgroud)

我找不到关于这种情况的文档或帖子,尽管我认为这是一个非常重要的单元测试,以确保类和库的正确行为和使用.

在包含异常/异常处理的其他语言中,assert将替换为类似的东西throw SomeError()然后,在单元测试中,您可以简单地将操作包装在try/ catchblock中并声明异常确实已设置,如下所示:

class SomeClass_Tests:XCTestCase{
  func test_foo_someStringParamaterIsEmpty_error(){
    //ACTION
    let someClassInstance = SomeClass()

    var expectedException:SomeException? = nil
    try{
      someClassInstance.foo("")
    }catch(someException:SomeException){
      expectedException = someException
    } …
Run Code Online (Sandbox Code Playgroud)

unit-testing assertions ios xctest swift

9
推荐指数
2
解决办法
4774
查看次数

验证 Swift 中抛出运行时错误的单元测试

谷歌搜索让我找到了一般的 Swift 错误处理链接,但我有一个更具体的问题。我认为这里的答案是“不,你运气不好”,但我想仔细检查一下我是否遗漏了一些东西。几年前的这个问题看起来很相似,并且有一些看起来很粗糙的解决方法的答案......我想看看最新版本的 Swift 是否使更优雅的东西成为可能。

情况:我有一个未用 标记的函数throws,并且使用try!

目标:我想创建一个单元测试来验证,是的,给这个函数错误的东西实际上会失败并抛出(运行时/致命)错误。

问题:

  1. 当我将此函数包装在 do-catch 中时,编译器警告我 catch 块无法访问。
  2. 当我运行测试并传递错误的参数时, do-catch 不会捕获错误。
  3. XCTAssertThrows也没有捕获错误。

该函数的构建目的是与另一个无声失败的函数具有相同的签名,我在模拟器上将其替换为该函数,以便在测试(自动或手动)期间可以大声失败。所以我不能只是将其更改为抛出函数,因为那样的话另一个函数必须被标记为抛出,并且我希望它默默地失败。

那么,有没有办法抛出一个可以在单元测试中捕获的未处理错误?

或者,我可以在不更改签名的情况下以可测试的方式让这个函数爆炸吗?

error-handling try-catch swift swift5

8
推荐指数
1
解决办法
1262
查看次数