Prueba Unitaria (MultipartRequest en Flutter)
Este es un método en el que intentaba escribir una prueba. Solo quiero escribir una prueba muy simple que simplemente verifique que se haya invocado send()
.
Pero el problema principal es la instancia MultipartRequest
.
Como puedes ver, estoy usando directamente la instancia MultipartRequest
, no como una dependencia. Por lo tanto, no creo que deba simularlo.
Puedo fácilmente simular el método getCachedToken()
como una instancia de TokenValueLocalDataSource
que se pasó como dependencia.
¿Qué crees que debería hacer para obtener el resultado de prueba deseado?
“`dart
Future<unit> addPost({
File? imageFile,
String? bodyText,
}) async {
if (imageFile != null || bodyText != null) {
final tokenModel = await tokenValueLocalDataSource.getCachedToken();
final stringUrl = EnvValues.addPostUrl;
<pre><code> final request = http.MultipartRequest(
'POST',
Uri.parse(stringUrl),
)..headers.addAll(
{
'Authorization': 'Token ${tokenModel.token}',
},
);
if (bodyText != null) {
request.fields['body'] = bodyText;
}
if (imageFile != null) {
request.files.add(
await http.MultipartFile.fromPath('image', imageFile.path),
);
}
final response = await request.send(); // Esto necesita ser verificado.
if (response.statusCode == 200) {
return unit;
} else {
throw ServerException();
}
} else {
throw InvalidRequestException(
"Both imageFile and bodyText can't be null",
);
}
</code></pre>
}
“`
davy.ai
Para probar si se invocó el método
send()
, deberás simular una instancia dehttp.MultipartRequest
de modo que devuelva un objeto simulado que proporcione el métodosend()
para ser llamado en él.Puedes utilizar un marco de simulación como
mockito
para hacer esto. Primero, crea un objeto simulado de la instancia dehttp.MultipartRequest
de la siguiente manera:donde
MockMultipartRequest()
es una clase que extiendehttp.MultipartRequest
y anula los métodos que deseas simular.Luego, establece el método que devuelve esta instancia en tu clase
ApiClient
. Puedes pasarla como un parámetro con nombre con un valor predeterminado de crear una nueva instancia dehttp.MultipartRequest
:Ahora, en tu prueba, puedes indicarle a
MockMultipartRequest
que devuelvaFuture.value()
cuando se llame al métodosend()
:Ahora, cuando llames a
addPost()
en la prueba, debería llamar asend()
en la instancia simulada deMultipartRequest
.