У меня есть набор тестов. В этих тестах есть метод очистки асинхронного теста, который никогда не завершится для последнего выполненного теста. Если я выполню 100 тестов или только один, тестовый запуск будет завершен до завершения последнего запуска очистки.
Метод очистки должен удалить ресурс по идентификатору. Бэкэнд создает идентификатор при создании ресурса, поэтому я знаю только, каким будет имя ресурса, прежде чем я начну, поэтому мой метод очистки сначала должен извлечь ресурс по имени, а затем удалить ресурс, как только у нас будет идентификатор.
Я оставил несколько комментариев в приведенном ниже коде о том, что я пробовал и как код ведет себя. Я могу заставить это работать правильно , если Я заставляю синхронные вызовы на всех строках кода, которые содержат 'await' в функции 'DeleteResourceByName'. Однако мне бы очень хотелось понять, почему я не могу заставить это работать с асинхронными вызовами.
// 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);
}
Как я могу гарантировать, что каждый ресурс будет удален в конце моего теста, независимо от того, сколькометоды испытаний запускаются?