首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >频谱测试用例死锁

频谱测试用例死锁
EN

Stack Overflow用户
提问于 2019-10-27 13:15:45
回答 1查看 375关注 0票数 1

我已经用specflow编写了一个测试用例如下:

代码语言:javascript
复制
[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()方法调用为异步方法:

代码语言:javascript
复制
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请求,如下所示:

代码语言:javascript
复制
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)。但在执行此方法后,单元测试继续旋转。没有错误或成功的结果显示。如果我从swagger调用Delete,它可以正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-30 06:28:51

在某些情况下,.GetAwaiter().GetResult()的用法可能会使管理同步上下文的线程陷入死锁,并通过该上下文本身。

我删除了GetAwaiter().GetResult(),并使方法异步。这解决了这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58579743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档