Тестовый блок Specflow - PullRequest
       14

Тестовый блок Specflow

0 голосов
/ 27 октября 2019

Я написал тестовый пример в specflow как показано ниже:

[Given(@"I have removed entity")]
    public async Task GivenIHaveRemovedEntity(Table table)
    {
        var employee = table.CreateInstance<TableGeneralInfoDto>();
        var schemas = await DataCatalogHooks.SchemasController.Get();
        var schema = schemas.Value.First(x => x.Name != null &&
            x.Name.Equals("BATCH_TEST", StringComparison.CurrentCultureIgnoreCase));
        var objectTypes = await DataCatalogHooks.ObjectTypesController.Get();
        var objectType = objectTypes.Value.First(x =>
            x.Name.Equals("Table", StringComparison.CurrentCultureIgnoreCase)
        );
        employee.SchemaId = schema.Id;
        employee.SystemName = string.Concat(schema.Name, ".", employee.ObjectName);
        employee.ObjectTypeId = objectType.Id;
        _scenarioContext["employee"] = employee;
        try
        {
            var entity = await DataCatalogHooks.TablesController.Get(employee.SystemName);
            await DataCatalogHooks.TablesController.Delete(entity.Value.Id);
        }
        catch { }
    }

TablesController.Delete () вызывает метод как асинхронный метод:

public async Task DeleteAsync(string id)
    {
        try
        {
            var relations = new List<DomainModels.Relation>();
            relations.AddRange(_relationRepository.GetBySourceTableIdAsync(id).GetAwaiter().GetResult());
            relations.AddRange(_relationRepository.GetByReferenceTableIdAsync(id).GetAwaiter().GetResult());
            await _relationRepository.Delete(relations);
            await _client.DeleteAsync(id);
        }
        catch (Exception e)
        {
            Validation.ExceptionManager.ThrowException(new Exception(e.Message));
            throw;
        }
    }

И этот метод внутренне вызывает запрос httpкак показано ниже:

public async System.Threading.Tasks.Task<SwaggerResponse<EntityCollection>> GetEntityCollectionAsync(string idOrName, string tenantId, System.Threading.CancellationToken cancellationToken)
    {
            var urlBuilder_ = new System.Text.StringBuilder();
            urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/v1.0/{tenantId}/collections/{idOrName}");
            urlBuilder_.Replace("{idOrName}", System.Uri.EscapeDataString(ConvertToString(idOrName, System.Globalization.CultureInfo.InvariantCulture)));
            urlBuilder_.Replace("{tenantId}", System.Uri.EscapeDataString(ConvertToString(tenantId, System.Globalization.CultureInfo.InvariantCulture)));

            var client_ = _httpClient;
            try
            {
                using (var request_ = new System.Net.Http.HttpRequestMessage())
                {
                    request_.Method = new System.Net.Http.HttpMethod("GET");
                    request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));

                    var url_ = urlBuilder_.ToString();
                    request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);

                    var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
                    try
                    {
                        var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);
                        if (response_.Content != null && response_.Content.Headers != null)
                        {
                            foreach (var item_ in response_.Content.Headers)
                                headers_[item_.Key] = item_.Value;
                        }

                        var status_ = ((int)response_.StatusCode).ToString();
                        if (status_ == "200")
                        {
                                var objectResponse_ = await ReadObjectResponseAsync<EntityCollection>(response_, headers_).ConfigureAwait(false);
                                return new SwaggerResponse<EntityCollection>((int)response_.StatusCode, headers_, objectResponse_.Object);
                            }
                        return new SwaggerResponse<EntityCollection>((int)response_.StatusCode, headers_, default(EntityCollection));
                    }
                    finally
                    {
                        if (response_ != null)
                            response_.Dispose();
                    }
                }
            }
            finally
            {
            }

    }

Этот метод возвращает результат успешно (200). Но после выполнения этого метода юнит-тест продолжает вращаться. Нет ошибок или успехов показывает результат. Если я вызываю Delete API из swagger, он работает нормально.

1 Ответ

1 голос
/ 30 октября 2019

Использование .GetAwaiter (). GetResult ();может в некоторых ситуациях заблокировать поток, управляющий контекстом синхронизации, и через него сам контекст.

Я удалил GetAwaiter (). GetResult () и сделал метод асинхронным. это решило проблему

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