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?
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.
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.
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.
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.
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);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With