Быстрое тестирование устройства с аналогом 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 равная техника?
Ответы
Ответ 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
Ответ 4
лучший способ - добавить мост, который я думаю.
просмотрите https://gist.github.com/akolov/8894408226dab48d3021
он работает для меня.
Ответ 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()
}
}