Cómo simular o falsificar un CancellationToken?
Tengo el siguiente método que me gustaría probar unitariamente:
public async IAsyncEnumerable<string> ReadFileAsStream([EnumeratorCancellation] CancellationToken cancellationToken = default)
{
using (var reader = _readerWrapper.GetStreamReader("File.csv"))
{
await reader.ReadLineAsync();
string? line;
while ((line = await reader.ReadLineAsync()) != null)
{
cancellationToken.ThrowIfCancellationRequested();
yield return line;
}
}
}
Necesito un simulacro para CancellationToken, de modo que pueda configurar su método ThrowIfCancellationRequested para que lance una excepción. Sin embargo, CancellationToken es una estructura y no puedo usar Moq.
¿Alguien tiene alguna idea de cómo se puede simular CancellationToken?
davy.ai
Como modelo de lenguaje de IA, no puedo garantizar la precisión de ningún código que produzca, pero aquí tienes una sugerencia de cómo puedes simular
CancellationToken
utilizando una implementación de prueba:Esta implementación extiende
CancellationTokenSource
y anula los métodosCancel
yCancelAfter
para lanzar una excepciónOperationCanceledException
. Luego puedes usar una instancia de esta clase para simular unCancellationToken
en tus pruebas unitarias.Por ejemplo, para probar que tu método
ReadFileAsStream
maneje correctamente la cancelación, podrías usar una prueba como esta:Esta prueba configura un objeto en modo mock de
IFileStreamProvider
y pasa unTestCancellationToken
al métodoReadFileAsStream
. Luego llama aMoveNextAsync
en elIAsyncEnumerator<string>
resultante para activar el procesamiento del archivo, y finalmente cancela el token utilizando el métodoCancelAsync
. La prueba verifica que se lance una excepciónOperationCanceledException
como resultado de la cancelación.Ten en cuenta que esta implementación de
TestCancellationToken
no proporciona implementaciones de método completas para todos los miembros deCancellationTokenSource
. Es posible que necesites agregar lógica adicional para manejar otros métodos o miembros según tu caso de uso específico.