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

时间:2015-05-21 19:00:57

标签: ios swift unit-testing assertions xctest

UPDATE:

在即将到来的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.")
  }
}

我使用assert电话,因为我认为这是Apple推荐的,而不是抛出异常,这在其他语言中很常见。

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

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

    //VALIDATE
    //**What goes here?
  }
}

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

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

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
    }

    //VALIDATE
    XCTAssertIsNotNil(expectedException)
  }
}

但是我在文档中看到的Swift中没有这样的构造或等效的解决方法。是否有任何已知的解决方案或解决方法来执行此类测试?

4 个答案:

答案 0 :(得分:1)

  

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

我理解你正在尝试做什么,因为我自己在Ruby程序中完成了它。但Swift(我经常有机会观察)不是Ruby!这里的问题是,当registerDesignerProxyListener_参数为空字符串时,您可以保证函数失败 - 在您的实际应用中。这是因为断言不在发布版本中运行。

结果是你可以在开发过程中使用assert作为调试的一种形式,但如果这种情况在现实生活中发生,你应该按顺序处理它,而不是崩溃。

然后测试断言是否发生"实际上并不是一种有效的单元测试技术,这就是你以这种方式使用它的原因。

答案 1 :(得分:1)

为什么尝试捕获错误而不是检查发生了什么而不是测试断言被抛出?

XCTAssertThrows()

而不是看到价值观 ?

答案 2 :(得分:0)

您可以签出XCTest框架中提供的XCTAssertThrowsXCTAssertThrowsSpecific宏。

也许您需要用[NSException raise]替换断言才能使其正常工作。

答案 3 :(得分:0)

Matt Gallagher的CwlPreconditionTesting project on github添加了catchBadInstruction函数,使您能够在单元测试代码中测试断言/先决条件失败。

CwlCatchBadInstructionTests file显示了其使用的简单说明。 (请注意,它仅适用于iOS的模拟器。)