2016-07-14 6 views
0

私はユニットテストの初心者です、私のボタンがビューに追加されているかどうかをテストしています。ユニットテストボタンが表示に追加されました

私の最初のテストが正常に渡されます。

XCTAssertNotNil(vc.button, "button Not Initialised") 

しかし、私の第二の試験は、私は

XCTAssertNotNil(vc.button.superview, "button Not added to view") 

コードでview.addSubview(ボタンを)持っていたときに私の質問は、私はテストを行う方法です失敗ボタンがビューに追加されているか、ストーリーボードを使用していないか、すべてがコード化されているかどうかを確認してください。私はコード内でaddSubviewを持っているかどうかにかかわらず、最初のテストは合格します。

おかげで私のViewControllerクラスで

私はボタンを初期化:

private(set) lazy var myButton: UIButton = { 
    let myButton = UIButton(frame: CGRectZero) 
    return myButton 
}() 

とのviewDidLoadで私はそれがサブビューとそれに制約を与えることを追加します。

view.addSubview(myButton) 

私のテスト機能は次のとおりです。

func testAddRoomButtonInRoomsViewController() { 
    let vc = myViewController() 
    XCTAssertNotNil(vc.myButton, "Button Not Initialised") 
    XCTAssertNotNil(vc.myButton.superview, "Button Not Added To View") 
} 
+0

は、あなたが完全なコードサンプルをください投稿できますか? – fiks

+0

はい、テストしたい実際のコードを共有することができます。 – tanzolone

答えて

1

viewDidLoadはテストケースでは呼び出されないため、失敗します。手動で呼び出す必要があります。

1.テストケースに拡張

extension UIViewController { 

     func startViewLifecycle() { 
      view.setNeedsLayout() 
      view.layoutIfNeeded() 
     } 
    } 

2.コールを紹介:

func testAddRoomButtonInRoomsViewController() { 
    let vc = myViewController() 
    vc.startViewLifecycle() 

    XCTAssertNotNil(vc.myButton, "Button Not Initialised") 
    XCTAssertNotNil(vc.myButton.superview, "Button Not Added To View") 
} 
+0

ありがとうございました –

0

スーパービューにビューが追加されたかどうかを確認するテストを作成することは、絶対に有効です。私は次のことを試してみましたし、それが正常に渡します。

- (void)testView 
{ 
    UIView *superview = [UIView new]; 
    UIView *view = [UIView new]; 

    [superview addSubview:view]; 
    XCTAssertNotNil(view.superview); 
} 

あなたのアサーションXCTAssertNotNil(vc.button.superview, "button Not added to view")が、それはあなたがスーパーにサブビューを追加していないので(おそらくあなたがテストしたいものである)、またはあなたのためのいずれかで障害が発生した場合テストを完了する前にスーパービューの割り当てが解除されます。

後者の場合、テストを実行するためにスーパービューを強く参照する必要がある場合、スーパービューは各サブビューを強く参照しますが、それ以外の方法では参照できませんサイクル)。したがって、view.superviewは実際には弱いプロパティであり、スーパービューの割り当てが解除された場合にはnilに設定されます。

- (void)testView 
{ 
    UIView *superview = [UIView new]; 
    UIView *view = [UIView new]; 

    [superview addSubview:view]; 

    superview = nil; 

    XCTAssertNil(view.superview);//superview will be deallocated by now - this value is nil 
} 

これが役立ちます。

// UPDATE:

は、コードを見てみると、viewDidLoadが呼び出されなかったとして、あなたがテスト前にaddSubview:を呼び出していなかったことが明らかです。 @figsはこれを回避する方法を提案しました。

+0

こんにちは、お返事ありがとうございます。元の質問にさらに多くのコードを追加しましたが、私が間違っていることについてまだ少し混乱しています。S –

関連する問題