cómo realizar una prueba unitaria de dos objetos que no son iguales en ios XCTestCase
-
20-12-2019 - |
Pregunta
Soy bastante nuevo en las pruebas unitarias, y en iOS en particular.
Tengo un caso de prueba que debería tener éxito si veo que dos objetos NO son iguales
No encuentro un método que me dé eso, además de solicitar que la prueba falle al comprobar que son iguales.
No deseo que una prueba falle para objetos que no son iguales,
Deseo que la prueba tenga éxito si los objetos no son iguales.
¿Qué método logrará eso?
Este es mi método de prueba:
-(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");
}
Solución
Simplemente pruebe lo que realmente desea que suceda, no es necesario complicar demasiado la prueba:
XCTAssertFalse(server1 == server, @"The objects should not be equal");
el ==
operador en objetos prueba la igualdad de punteros, por lo que si server1
son los mismos objetos que server2
entonces tu prueba fallará como quieras.
Alternativamente
XCTAssertTrue(server1 != server, @"The objects should not be equal");
Si desea probar un tipo diferente de igualdad, como se hace con isEqual
, que devuelve verdadero si los atributos del objeto son iguales, incluso si los objetos no son la misma instancia, entonces:
XCTAssertFalse([server1 isEqual:server], @"The objects should not be equal");
Todo depende del tipo de igualdad que estés probando.
Otros consejos
Las macros XCTest generalmente admiten condiciones verdaderas, no falsas.Así que mientras puedas decir
XCTAssertEqualObjects(server1, server);
para probar la igualdad, y
XCTAssertEqual(server1, server);
Para probar la identidad, no es fácil invertirlos.Tienes que recurrir a XCTAssertTrue/False, que no es tan bueno porque simplemente te dice que la aserción falló, pero no te dice los valores a menos que los incluyas explícitamente en el mensaje:
XCTAssertFalse([server1 isEqual:server], @"Oops, both objects equal %@", server);
Aquí es donde resultan útiles los emparejadores más expresivos, que se encuentran en marcos como OCHamcrest, Kiwi, Expecta y Cedar.En OCHamcrest, por ejemplo, las coincidencias se pueden componer a partir de otras coincidencias, por lo que puedes envolver isNot(…)
alrededor de cualquier comparador.Para probar que el servidor1 y el servidor2 son no igual, es
assertThat(server, isNot(equalTo(server1))));
Asimismo, para probar que el servidor1 y el servidor2 son no idéntico, es
assertThat(server, isNot(sameInstance(server1))));