Search code examples
c#.netunit-testingstubtimeoutexception

Throw ExpectedException TimeoutException with Stub is not working c#


I have this unit test, and I've been trying to throw an exception on it, but I'm not able to do it, please can you help me?

    [TestMethod]
    [ExpectedException(typeof(TimeoutException))]
    public async Task HandleAsyncDeleteModel_WhenRepositoryFails_ThrowsException()
    {
        //Arrange
        var token = new CancellationToken();
        var deleteModel = new DeleteProcessCommand(_img, _tnt, _pro, _url);
        var writeRepository = new StubIWriteRepository<Dto>()
        {
            DeleteIfExistsAsyncGuidGuidGuidCancellationToken = (img, tnt, pro, tkn) =>
            { 
                throw new TimeoutException();
            }
        };

        var Logger = new StubILogger();
        var commandHandler = new CommandHandler(Logger, writeRepository, null, null, null, null, null, null);

        //Act
        await commandHandler.HandleAsync(deleteModel, token);
    }

Solution

  • Unit tests do not wait for async methods. No one is calling for the results of the async method. You need to do a .Wait on it to force it to wait for a result.

    [TestMethod]
    [ExpectedException(typeof(TimeoutException))]
    public async Task HandleAsyncDeleteModel_WhenRepositoryFails_ThrowsException()
    {
        //Arrange
        var token = new CancellationToken();
        var deleteModel = new DeleteProcessCommand(_img, _tnt, _pro, _url);
        var writeRepository = new StubIWriteRepository<Dto>()
        {
            DeleteIfExistsAsyncGuidGuidGuidCancellationToken = (img, tnt, pro, tkn) =>
            { 
                throw new TimeoutException();
            }
        };
    
        var Logger = new StubILogger();
        var commandHandler = new CommandHandler(Logger, writeRepository, null, null, null, null, null, null);
    
        //Act
        commandHandler.HandleAsync(deleteModel, token).Wait();
    }