KIFでUI操作途中に通信処理を挟む方法

KIFでUI操作するテスト書いていて、UI操作 -> APIを叩く通信処理 -> UI操作っていうテストを書くとうまく通らない事があった。

こんなかんじ

    func testHoge() {
        tester().tapViewWithAccessibilityLabel("Foo")

        let expectation = self.expectationWithDescription("wait for api callback")

        SomeApi().getBoo() {
            expectation.fulfill()
        }


        self.waitForExpectationsWithTimeout(3) { (error) -> Void in
            XCTAssertNil(error)
        }

        tester().tapViewWithAccessibilityLabel("Boo")
    }

解決策

そんなときはtester().runBlock()内で実行してあげるとちゃんとAPIもUI操作と同じように動いてくれる

    func testHoge() {
      tester().tapViewWithAccessibilityLabel("Foo")

      tester().runBlock {
        let expectation = self.expectationWithDescription("wait for api callback")

        SomeApi().getBoo() {
            expectation.fulfill()
        }

        self.waitForExpectationsWithTimeout(3) { (error) -> Void in
            XCTAssertNil(error)
        }

        return KIFTestStepResult.Success
      }

      tester().tapViewWithAccessibilityLabel("Boo")
    }