2013-06-12 2 views
1

Je suis en train de tester l'événement viewDidLoad sur l'un de mes UIViewController.UnitTests et iOs: viewDidLoad déclenché deux fois

- (void)testMyView 
{ 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
    MyViewController *vc = [storyboard instantiateViewControllerWithIdentifier:MYID]; 
    [vc viewDidLoad]; 

    STAssertNotNil(vc, @"MyViewController should not be nil"); 
} 

Si je supprime la ligne [vc viewDidLoad];, le viewDidLoad est jamais déclenché. Si je laisse [vc viewDidLoad]; en place, viewDidLoad est déclenché deux fois.

Je comprends que les vues sont chargées paresseusement, mais comment puis-je éviter ce comportement?

Existe-t-il une meilleure pratique concernant les tests View?

+0

utilisation viewDidAppear au lieu de viewDidLoad ... – lakesh

+0

vous devez appeler la méthode '-loadView' au lieu du' -viewDidLoad' ... et il a gagné » t être invoqué deux fois. – holex

+0

Eh bien, c'était mon premier essai mais ça ne marche pas. 'vc.view.hidden = NO;' a fait l'affaire. –

Répondre

10

Vous devez accéder à la vue pour qu'elle se charge automatiquement.

Vous pouvez utiliser quelque chose comme ça pour le faire sans effets secondaires:

vc.view.hidden = NO; // Or YES if it is supposed to be hidden. 

Oh, puis retirez votre appel manuel à viewDidLoad car il ne sera pas nécessaire.

+1

(vide) vc.view; fonctionnera aussi, vous n'avez pas besoin d'accéder à une propriété sur .view. Accéder à .view chargera les vues. – possen

0

Effectue un chargement paresseux en utilisant [vc view];

1

Lire ma note https://github.com/onmyway133/blog/issues/52

Supposons que nous ayons le contrôleur de vue suivant

class ListController: UIViewController { 
    override func viewDidLoad() { 
    super.viewDidLoad() 
    view.backgroundColor = .white 
    } 
} 

Apprenez à connaître viewDidLoad

Nous savons que viewDidLoad est appelé lorsque la vue est créée la première fois. Ainsi, dans le test unitaire, si vous utilisez viewDidLoad pour déclencher, vous allez tomber dans un piège

func testSetup() { 
    let controller = ListController() 
    controller.viewDidLoad() 
} 

Pourquoi est-viewDidLoad appelé deux fois?

Il est appelé une fois dans votre test Et dans votre méthode de viewDidLoad, vous accédez à vue, qui est créé la première fois, d'où il déclenche viewDidLoad à nouveau

La bonne façon

Le La meilleure pratique n'est pas de déclencher vous-même des événements, mais de faire quelque chose pour que l'événement se produise. Dans l'unité de test, nous avons accès à tout point de vue pour déclencher viewDidLoad

func testSetup() { 
    let controller = ListController() 
    let _ = controller.view 
} 
Questions connexes