2016-04-18 26 views
5

前提条件を持つスウィフトメソッドのテストを書く方法を教えてください。ここでの例である:前提条件付きスウィフトコードのテスト

func doublePositive(n:Int) -> Int { 
    precondition(n >= 0) 
    return 2*n 
} 

XCTAssertThrowsErrorを使用して動作しない。

func testDoublePositive() { 
    XCTAssertEqual(10, testObject.doublePositive(5)) // Works 
    XCTAssertThrowsError(testObject.doublePositive(-1)) // Breaks 
} 

テストを実行しているときは、このエラーが生成:

スレッド1:EXEC_BAD_INSTRUCTION(コード= EXCI386_INVOP、サブコード= 0x0)

precondiをテストする方法はありますかスウィフトの数々?

+2

前提条件で失敗を「キャッチ」する標準的な方法はありませんが、常にプログラムを停止しますが、いくつかの調整があります。http://www.cocoawithlove.com/blog/2016/02/02 /partial-functions-part-toto-catching-precondition-failures.html – ogres

+0

@ogresうわー、いい記事です、ありがとう! – dasblinkenlight

+0

私はテストコードではないのを見るのを待つことができません。私はこれがあなたがテストしようとしているものをテストすることができて嬉しいですが、私はそのウェブサイトが嫌い...私はあなたの主なターゲットでこれを実装し、クラッシュからスレッドを孤立させたスレッドを孤立させるだけです(そして、私はそれが似たObjective-Cの記事で起こっているのを見ているからです) – nhgrif

答えて

3

これらの前提条件を満たす入力で動作をテストするだけで、前提条件を持つSwiftメソッドをテストします。前提条件が満たされていないときの動作は、前提条件が標準ライブラリに焼き付けられているため、これ以上のテストを行う必要はありません。

前提条件が正しく指定されているかどうかが疑わしい場合は、前提条件式をブール関数に引き出し、無効な入力から正しく有効であるかどうかをテストできます。

しかし、あなたはあなたがここに望むものをあなた自身のために作成することができます。

前提条件/アサーションの失敗の例外を生成するオプションは、トリックを行うだろう:一つは、デバッグビルドではそれをオンにし、そしてそれを回すだろうリリースビルドではオフになります。

Appleのpreconditionを呼び出す代わりに、独自の関数、たとえばrequireを書くことができます。これは、あなたが望むように条件付きで行動することができます。 preconditionを使用していれば、どこでもこれを使用できます。

+0

私自身の機能を作ることはいい考えです、ありがとう! – dasblinkenlight