XCTest断言期望并未实现

时间:2016-02-16 00:09:01

标签: ios xcode xctest xctestexpectation

当使用XCTest和XCTestExpectation编写某个异步测试时,我想声明某个块已执行。以下代码成功断言执行了一个块,如果没有,则测试失败。

#import <XCTest/XCTest.h>
#import "Example.h"

@interface Example_Test : XCTestCase

@property (nonatomic) Example *example;

@end

@implementation Example_Test
- (void)setUp {
    [super setUp];
}

- (void)tearDown {
     [super tearDown];
}

- (void)testExampleWithCompletion {
    self.example = [[Example alloc] init];
    XCTestExpectation *expectation = [self expectationWithDescription:@"expection needs to be fulfilled"];
    [self.example exampleWithCompletion:^{
        [expectation fulfill]
    }];
    [self waitForExpectationsWithTimeout:2.0 handler:^(NSError *error) {
        if (error) {
            NSLog(@"Timeout Error: %@", error);
        }
    }];
}

似乎没有一种明显的方法可以反过来执行此操作;如果块在超时后没有执行则测试成功,如果在超时之前执行则失败。除此之外,我想声明该块在以后满足不同条件时执行。

使用XCTestExpectation有一种直接的方法吗?还是我必须创建一个变通方法?

2 个答案:

答案 0 :(得分:9)

我知道这已经有几年了,但我偶然发现XCTestExpectation上的一个参数可以让你反转期望值。希望这将有助于其他人绊倒这个。答案在Swift中

let expectation = XCTestExpectation(description: "")
expectation.isInverted = true

文档:https://developer.apple.com/documentation/xctest/xctestexpectation/2806573-isinverted

答案 1 :(得分:2)

您可以通过计划在超时之前运行的dispatch_after调用来实现此目的。使用BOOL来记录块是否已执行,以及在期望完成后通过或未通过测试的断言。

- (void)testExampleWithCompletion {
    self.example = [[Example alloc] init];
    __block BOOL completed = NO;
    [self.example exampleWithCompletion:^{
        completed = YES;
    }];

    XCTestExpectation *expectation = [self expectationWithDescription:@"expection needs to be fulfilled"];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [expectation fulfill];
    });
    [self waitForExpectationsWithTimeout:3.0 handler:nil];

    XCTAssertEqual(completed, NO);
}