Тестовый запуск Visual Studio завершается до завершения метода очистки асинхронного теста для последнего теста - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть набор тестов. В этих тестах есть метод очистки асинхронного теста, который никогда не завершится для последнего выполненного теста. Если я выполню 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);
}

Как я могу гарантировать, что каждый ресурс будет удален в конце моего теста, независимо от того, сколькометоды испытаний запускаются?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...