在异步测试清除方法完成最后一次测试之前,Visual Studio测试运行完成

时间:2019-11-01 23:27:09

标签: c# asynchronous .net-core mstest

我有一套测试。这些测试具有异步测试清除方法,该方法永远不会在最后执行的测试中完成。如果我运行100个测试,或仅运行一个,则测试运行将在上次清理运行完成之前完成。

清除方法必须按ID删除资源。后端在创建资源时会创建ID,所以我在开始之前只知道资源的名称,因此我的清理方法首先需要按名称检索资源,然后在获得ID后删除资源。

我在下面的代码中留下了一些注释,这些注释是我尝试过的内容以及代码的行为方式。如果我在'DeleteResourceByName'函数中强制所有包含'await'的代码行上进行同步调用,则可以正确地操作 。但是,我真的很想理解为什么我不能让它与异步调用一起工作。

// The cleanup helper function
public async Task DeleteResourceByName(string name)
{
    if (!string.IsNullOrWhiteSpace(name))
    {
        var response = await this.Requester.GetResource(name); //Test cleanup always stops here for last test.
        if (response.StatusCode.Equals(HttpStatusCode.OK))
        {
            var payload = await response.Content.ReadAsStringAsync();  
            var token = JsonConvert.DeserializeObject<JToken>(payload);
            var resourceId = token.SelectToken("jpath.to.resource.id").ToObject<Guid>();
            if (resourceId != Guid.Empty)
            {
                await this.Requester.DeleteResource(resourceId);
            }
        }
    }
}

// In my test class I have this property
private ICollection<Task> CleanupTasks { get; } = new List<Task>();

// Test Init
[TestInitialize]
public void TestInitialize()
{
    this.CleanupTasks.Clear();
    DoSomeOtherStuff();
}

// Test cleanup method
[TestCleanup]
public async Task FormulaTestCleanup()
{
    this.CleanupTasks.ForEachItem(t => t.Start());
    await Task.WhenAll(this.CleanupTasks);
}
// I have also tried making this function return void and running Task.WhenAll().GetAwaiter().GetResult(); with the same result

// An example test
[TestMethod]
public async Task MyTest()
{
    var creationData = getTheCreationData();
    this.CleanupTasks.Add(new Task(async () => { await this.DeleteResourceByName(creationData.Name); }));
    await TestTheAPICallWithTheData(creationData);
}

无论运行了多少测试方法,如何确保在测试结束时删除每个资源?

0 个答案:

没有答案
相关问题