Question

Je suis assez nouveau dans les tests unitaires, et sous iOS en particulier

J'ai un test qui devrait réussir si je vois que deux objets ne sont PAS égaux

Je ne trouve pas de méthode qui me donne cela, en plus de demander l'échec du test après avoir vérifié qu'ils sont égaux.

Je ne souhaite pas qu'un test échoue pour des objets qui ne sont pas égaux,

je souhaite que le test réussisse si les objets ne sont pas égaux.

Quelle méthode y parviendra ?

Voici ma méthode de test :

-(void)testServerProtocolSetting{

ServerProtocol *server = [ServerProtocol sharedInstance];

id stub = [OCMockObject mockForClass:[ServerProtocol class]];

ServerProtocol *server1 = server;

[[stub expect]isNULL];

[ServerProtocol setSharedInstance:stub];

[stub verify];

server = [ServerProtocol sharedInstance];

XCTAssertEqualObjects(server1, server, @"server and server1 are not equal");

}

Était-ce utile?

La solution

Testez simplement ce que vous voulez réellement, pas besoin de trop compliquer votre test :

XCTAssertFalse(server1 == server, @"The objects should not be equal");

le == L'opérateur sur les objets teste l'égalité des pointeurs, donc si server1 est les mêmes objets que server2 alors votre test échouera comme vous le souhaitez.

Alternativement

XCTAssertTrue(server1 != server, @"The objects should not be equal");

Si vous souhaitez tester un autre type d'égalité, comme avec isEqual, qui renvoie true si les attributs de l'objet sont égaux, même si les objets ne sont pas la même instance, alors :

XCTAssertFalse([server1 isEqual:server], @"The objects should not be equal");

Tout dépend du type d'égalité que vous recherchez.

Autres conseils

Les macros XCTest prennent généralement en charge les vraies conditions, pas les fausses.Alors même si tu peux dire

XCTAssertEqualObjects(server1, server);

pour tester l'égalité, et

XCTAssertEqual(server1, server);

pour tester l'identité, il n'est pas facile de les inverser.Vous devez vous rabattre sur XCTAssertTrue/False, ce qui n'est pas aussi efficace car il vous indique simplement que l'assertion a échoué, mais ne vous indique pas les valeurs à moins que vous ne les incluiez explicitement dans le message :

XCTAssertFalse([server1 isEqual:server], @"Oops, both objects equal %@", server);

C'est là que des matchers plus expressifs sont utiles, que l'on trouve dans des frameworks comme OCHamcrest, Kiwi, Expecta et Cedar.Dans OCHamcrest, par exemple, les correspondants peuvent être composés à partir d'autres correspondants, vous pouvez donc les envelopper isNot(…) autour de n’importe quel matcher.Pour tester que server1 et server2 sont pas égal, c'est

assertThat(server, isNot(equalTo(server1))));

De même, pour tester que server1 et server2 sont pas identique, c'est

assertThat(server, isNot(sameInstance(server1))));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top