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.

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?

Tags:  , ,

Answer

  1. Avatar for 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:

    public class TestCancellationToken : CancellationTokenSource
    {
        public override void Cancel()
        {
            throw new OperationCanceledException();
        }
    
        public override void CancelAfter(int millisecondsDelay)
        {
            throw new OperationCanceledException();
        }
    }
    

    Esta implementación extiende CancellationTokenSource y anula los métodos Cancel y CancelAfter para lanzar una excepción OperationCanceledException. Luego puedes usar una instancia de esta clase para simular un CancellationToken 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:

    [Test]
    public async Task ReadFileAsStream_CancellationTokenSet_ThrowsOperationCanceledException()
    {
        // Arrange
        var cancellationToken = new TestCancellationToken();
        var fileStreamProviderMock = new Mock<ifilestreamprovider>();
    
        // Act
        var asyncEnumerable = fileStreamProviderMock.Object.ReadFileAsStream(cancellationToken.Token);
        await asyncEnumerable.MoveNextAsync();
    
        // Assert
        Assert.ThrowsAsync<operationcanceledexception>(() => cancellationToken.CancelAsync());
    }
    

    Esta prueba configura un objeto en modo mock de IFileStreamProvider y pasa un TestCancellationToken al método ReadFileAsStream. Luego llama a MoveNextAsync en el IAsyncEnumerator<string> resultante para activar el procesamiento del archivo, y finalmente cancela el token utilizando el método CancelAsync. La prueba verifica que se lance una excepción OperationCanceledException 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 de CancellationTokenSource. Es posible que necesites agregar lógica adicional para manejar otros métodos o miembros según tu caso de uso específico.

Comments are closed.