我有一套测试。这些测试具有异步测试清除方法,该方法永远不会在最后执行的测试中完成。如果我运行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);
}
无论运行了多少测试方法,如何确保在测试结束时删除每个资源?