Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 519
codeSetter Avatar asked Dec 04 '13 12:12

codeSetter


People also ask

Can TestInitialize be async?

It's possible to have async [TestInitialize] , async [ClassInitialize] and async [TestMethod] just simply use await. Using async and await properly is probably the cleanest way to do it.

What are some of the disadvantages of async methods?

One of the downsides to asynchronous programming is that too many asynchronous requests can bog down your server and make your program actually function slower.

Does TestInitialize run for each test?

TestInitialize and TestCleanup are ran before and after each test, this is to ensure that no tests are coupled. If you want to run methods before and after ALL tests, decorate relevant methods with the ClassInitialize and ClassCleanup attributes.

Why you shouldn't use async void?

Async void methods can wreak havoc if the caller isn't expecting them to be async. When the return type is Task, the caller knows it's dealing with a future operation; when the return type is void, the caller might assume the method is complete by the time it returns.


1 Answers

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);
    }
}
like image 155
Stephen Cleary Avatar answered Sep 19 '22 19:09

Stephen Cleary