6

Xcode 5.0 と XCTesting を使用して次の単体テストに合格するのはなぜですか? つまり、私は結論を理解しています: 1 == 0 は評価されません。しかし、なぜ評価されないのでしょうか。失敗するようにこれを実行するにはどうすればよいですか?

- (void)testAnimationResult
{
    [UIView animateWithDuration:1.5 animations:^{
        // Some animation
    } completion:^(BOOL finished) {
        XCTAssertTrue(1 == 0, @"Error: 1 does not equal 0, of course!");
    }];
}
4

4 に答える 4

9

これは、技術的には機能します。しかしもちろん、テストは 2 秒間実行されます。数千のテストがある場合、これは合計される可能性があります。

より効果的なのは、カテゴリ内の UIView 静的メソッドをスタブ化して、すぐに有効にすることです。次に、そのファイルをテスト ターゲット (アプリ ターゲットではなく) に含めて、カテゴリがテストにのみコンパイルされるようにします。を使用しております:

#import "UIView+Spec.h"

@implementation UIView (Spec)

#pragma mark - Animation
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion {
    if (animations) {
        animations();
    }
    if (completion) {
        completion(YES);
    }
}

@end

上記は単にアニメーションブロックをすぐに実行し、完了ブロックも提供されている場合はすぐに実行します。

于 2013-11-13T01:20:53.260 に答える
2

@dasblinkenlight は正しい軌道に乗っていました。これは、正しく機能させるために私がしたことです:

- (void)testAnimationResult
{
    [UIView animateWithDuration:1.5 animations:^{
        // Some animation
    } completion:^(BOOL finished) {
        XCTAssertTrue(1 == 0, @"Error: 1 does not equal 0, of course!");
    }];

    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];
}
于 2013-10-29T23:12:26.457 に答える