swift - バージョン - XCTAssertThrowsアナログを用いたスイフトユニットテスト



swift バージョン (4)

XCTAssertThrowsと同等のものはありません。 今のところ、ネイティブ関数を使用することはできませんが、いくつかの目的関数を持つ解決策があります。 Quick、またはNimbleだけを使用できます。 または自分のアサーション機能を作成する - この記事を参照 - http://modocache.io/xctest-the-good-parts - 潜在的な改善#2:XCTAssertThrowsをSwiftに追加する

https://src-bin.com

迅速な言語単位テストで例外をスローすることを確認する同等のものはありますか?

たとえば私はクラスを持っています:

class Square : NSObject{

    let sideLength: Int

    init(sideLength: Int) {
        assert(sideLength >= 0, "Wrong initialization of Square class with below zero side length")
        self.sideLength = sideLength
        super.init()
    }
}

それを確認するテストと動作します。 客観的なCIでこのようなテストメソッドを書くことができます:

- (void)testInitializationWithWrongSideLengthThrowsExceptions{
   XCTAssertThrows([[Shape alloc] initWithSideLength: -50], "Should throw exceptions on wrong side values initialisations");
}

スウィフトの同等技術とは何ですか?


Answer #1

スウィフト2で正しい方法:

class Square : NSObject{

    let sideLength: Int

    init(sideLength: Int) throws { // throwable initializer
        guard sideLength >= 0 else { // use guard statement
           throw ...// your custom error type
        }

        self.sideLength = sideLength
        super.init()
    }
}

テスト:

func testInitThrows() {
        do {
            _ = try Square(sideLength: -1) // or without parameter name depending on Swift version
            XCTFail()
        } catch ... { // your custom error type

        } catch {
            XCTFail()
        }
    }

Answer #2

次の3つのファイルをテストに追加すると、

//  ThrowsToBool.h
#import <Foundation/Foundation.h>

/// A 'pure' closure; has no arguments, returns nothing.
typedef void (^VoidBlock)(void);

/// Returns: true if the block throws an `NSException`, otherwise false
BOOL throwsToBool(VoidBlock block);


//  ThrowsToBool.m
#import "ThrowsToBool.h"

BOOL throwsToBool(VoidBlock const block) {
    @try {
        block();
    }
    @catch (NSException * const notUsed) {
        return YES;
    }
    return NO;
}


// xxxTests-Bridging-Header.h
#import "ThrowsToBool.h"

次に、次のように書くことができます:

XCTAssert(throwsToBool {
   // test code that throws an NSException
})

しかし、それは主張または前提条件のためには機能しません:(

PS私は考えを得た: http://modocache.io/xctest-the-good-parts : http://modocache.io/xctest-the-good-parts


Answer #3

私は、 assert()関数はデバッグの目的でのみ使うべきだと思います。 アップルのSwift-Book( https://itun.es/de/jEUH0.l )の以下の声明のためだけでなく、

「アサーションによってアプリが終了することになり、無効な条件が発生しにくいようにコードを設計することに代わるものではありません」

それで私はこれを次のように解決します:

import Cocoa
import XCTest

class Square
{
    let sideLength: Int

    init(_ sideLength: Int)
    {
        self.sideLength = sideLength >= 0 ? sideLength : 0
    }
}

class SquareTests: XCTestCase
{
    override func setUp() { super.setUp() }
    override func tearDown() { super.tearDown() }

    func testMySquareSideLength() {
        let square1 = Square(1);
        XCTAssert(square1.sideLength == 1, "Sidelength should be 1")

        let square2 = Square(-1);
        XCTAssert(square2.sideLength >= 0, "Sidelength should be not negative")
    }
}

let tester = SquareTests()
tester.testMySquareSideLength()




swift