Search code examples
c#.netunit-testingasynchronoustdd

Async TestInitialize guarantees test to fail


It is incorrect by design to have async call within TestInitialize, as TestInitialize has to happen before any TestMethod and have fixed signature.

Can this be correct approach in any way to have async TestInitialize as well?

    private int val = 0;

    [TestInitialize]
    public async Task  TestMehod1()
    {
        var result = await LongRunningMethod();
        val = 10;
    }

    [TestMethod]
    public void  TestMehod2()
    {
        Assert.AreEqual(10, val);
    }

Any thoughts?


Solution

  • Probably the cleanest way to do this is to have TestInitialize start the asynchronous operation, as such:

    [TestClass]
    public class UnitTestAsync
    {
        private Task<int> val = null;
    
        [TestInitialize]
        public void TestInitializeMethod()
        {
            val = TestInitializeMethodAsync();
        }
    
        private async Task<int> TestInitializeMethodAsync()
        {
            return await LongRunningMethod();
        }
    
        private async Task<int> LongRunningMethod()
        {
            await Task.Delay(20);
            return 10;
        }
    
        [TestMethod]
        public async Task TestMehod2()
        {
            Assert.AreEqual(10, await val);
        }
    }