Async TestInitialize保证测试失败



在TestInitialize中进行异步调用是不正确的,因为TestInitialize必须在任何TestMethod之前进行,并且具有固定签名。

这在任何方面都是正确的异步TestInitialize方法吗?

    private int val = 0;
    [TestInitialize]
    public async Task  TestMehod1()
    {
        var result = await LongRunningMethod();
        val = 10;
    }
    [TestMethod]
    public void  TestMehod2()
    {
        Assert.AreEqual(10, val);
    }

有什么想法吗?

您的代码是正确的

澄清这个答案是在最初的问题之后的5年零2个月。当时使用异步[TestInitialize]可能是一个编译错误,但现在不是了。

异步[TestInitialize]、异步[ClassInitialize]和异步[TestMethod]可以只使用await。

正确使用async和await可能是最干净的方法。

private Category rootCategory;
[TestInitialize]
public async Task TestInitialize()
{
    var loader = new CategoryLoader();
    rootCategory = await loader.GetAllCategoriesAsync();
}

[TestInitialize]在每个[TestMethod]之前运行,所以根据我在这里尝试测试的内容,最好只加载一次,然后进行所有断言,而不是多次支付加载时间。但你需要小心,这样测试就不会相互影响,以获得一致和正确的结果。

请注意,这不再是一个单元测试,因为我正在测试与外部服务的集成。

可能最干净的方法是让TestInitialize启动异步操作,例如:

[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);
    }
}

您想要做的是使用.Result.Wait()来同步阻止TestInitialize修饰的方法。您可以执行以下操作:

private int val = 0;
[TestInitialize]
public void TestMehod1()
{
    Task<object> result = LongRunningMethod();
    result.Wait();
    val = 10;
}
[TestMethod]
public void  TestMehod2()
{
    Assert.AreEqual(10, val);
}

只需为各种初始化调用创建一个任务数组(每个返回任务),然后使用task.WaitAll()

    [ClassInitialize()]
    public static void Initialize(TestContext context)
    {
        List<Task> tasks = new List<Task>();
        tasks.Add(InitializeMethod1());
        tasks.Add(InitializeMethod2());
        Task.WaitAll(tasks.ToArray());
    }
    public static async Task InitializeMethod1()
    {
    }
    public static async Task InitializeMethod2()
    {
    }

最新更新