2017-10-19 15 views
1

J'ai un test unitaire Swift semblable au suivant:Comment affirmer la valeur d'un test d'unité Bool dans Swift optionnel?

var firstArgumentInClosure: Bool? 
someFunc { firstArgumentInClosure = $0 } 
XCTAssertTrue(firstArgumentInClosure?) 

Je suis en train d'affirmer la fermeture a été appelé le premier argument étant true.

Cela ne compile pas avec le message d'erreur:

'? doit être suivi d'un appel, la recherche de membre ou

indice

Une façon que je peux résoudre ce problème est en changeant l'affirmation:

XCTAssertEqualTrue(firstArgumentInClosure ?? false) 

est-il pas de manière plus concise de le faire? C'est un peu étrange de voir le ?? false. Je ne veux pas non plus déplier implicitement l'option avec ! parce que je ne veux pas que le test échoue, je veux juste que le test échoue si firstArgumentInClosure est nil ou false. Je veux aussi éviter tout if let pour garder les choses concises.

De même, comment est-ce que j'écrirais une telle assertion quand j'essaye d'employer XCTAssertFalse pour m'assurer qu'un Bool? est false?

+0

Qu'est-ce qui ne va pas avec 'XCTAssertEqualTrue (firstArgumentInClosure ?? false)'? – Alexander

+0

Si le test échoue, il n'est pas clair si la fermeture n'a jamais été appelée ou si la fermeture a été appelée avec le mauvais argument. –

Répondre

0

L'approche la plus propre que j'ai trouvé est:

XCTAssertEqual(firstArgumentInClosure, true) 

Ou si je veux affirmer qu'il est faux:

XCTAssertEqual(firstArgumentInClosure, false) 

Cela ne nécessite pas déballer en option.

2

Les types facultatifs nécessitent plus d'efforts pour tester en raison d'un état supplémentaire.

Vous pouvez utiliser XCTAssertTrue(firstArgumentInClosure ?? false) pour tester true et XCTAssertFalse(firstArgumentInClosure ?? true) pour tester false. Cependant, ceci n'est pas idéal, car il mélange les échecs dus à nil avec des échecs dus à la réception d'une valeur opposée.

Une meilleure (mais beaucoup plus) approche utilise if let pour déballer le résultat des tests:

if let unwrappedFirstArg = firstArgumentInClosure { 
    XCTAssertFalse(unwrappedFirstArg) 
} else { 
    XCTFail("Received nil in firstArgumentInClosure") 
} 

Maintenant, votre sortie de test pourrait identifier le problème avec précision, ce qui rend plus facile pour vous d'enquêter sur la question.