Подтвердить что ты не робот

Быстрое тестирование устройства с аналогом XCTAssertThrows

Есть ли какой-либо эквивалент для проверки исключения исключений в быстрых языковых модулях?

Например, у меня есть класс:

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()
    }
}

и Test, чтобы проверить работу. В объекте C я могу написать тестовый метод следующим образом:

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

Что такое Swift равная техника?

4b9b3361

Ответ 1

Если вы добавите в свои тесты следующие три файла:

//  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

Ответ 2

Я думаю, что assert() -функция должна использоваться только для целей отладки. Не только из-за следующего заявления от Apple 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()

Ответ 3

В QuickTime нет эквивалента XCTAssertThrows. Пока вы не можете использовать собственную функцию, но есть решение с помощью некоторой справки objective-c. Вы можете использовать Quick или только Nimble. Или создать свою собственную функцию assert - см. Эту статью - http://modocache.io/xctest-the-good-parts - Потенциальное улучшение # 2: Добавить XCTAssertThrows в Swift

Ответ 5

правильный путь в Swift 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()
        }
    }