es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para probar si se invocó el método send(), deberás simular una instancia de http.MultipartRequest de modo que devuelva un objeto simulado que proporcione el método send() 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 de http.MultipartRequest de la siguiente manera:

    final mockMultipartRequest = MockMultipartRequest();
    

    donde MockMultipartRequest() es una clase que extiende http.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 de http.MultipartRequest:

    class ApiClient {
      http.Client? client;
    
      ApiClient({
        this.client,
      });
    
      Future<unit> addPost({
        File? imageFile,
        String? bodyText,
        http.MultipartRequest request = const http.MultipartRequest('POST', Uri()),
        //                            ^^^^ aquí
      }) async {
        //...
    

    Ahora, en tu prueba, puedes indicarle a MockMultipartRequest que devuelva Future.value() cuando se llame al método send():

    test('addPost debería llamar a send() en MultipartRequest', () async {
      final mockApiClient = ApiClient();
      final mockTokenValueLocalDataSource = MockTokenValueLocalDataSource();
      final mockMultipartRequest = MockMultipartRequest();
    
      when(mockApiClient.tokenValueLocalDataSource).thenReturn(mockTokenValueLocalDataSource);
      when(mockTokenValueLocalDataSource.getCachedToken()).thenAnswer((_) async => TokenModel());
      when(mockMultipartRequest.send()).thenAnswer((_) async => {});
      //                                            ^^^^^^^^^^^^^^^
    
      await mockApiClient.addPost(request: mockMultipartRequest);
    
      verify(mockMultipartRequest.send()).called(1);
    });
    

    Ahora, cuando llames a addPost() en la prueba, debería llamar a send() en la instancia simulada de MultipartRequest.

Comments are closed.