C# 当Cosmos DB emulator未运行时,如何正确处理这种情况?

C# 当Cosmos DB emulator未运行时,如何正确处理这种情况?,c#,unit-testing,azure-cosmosdb,C#,Unit Testing,Azure Cosmosdb,我有几个单元测试(C#),用于初始化数据库和两个随机数据集合,以便在Cosmos DB emulator中进行测试。我的问题是,当我还没有启动仿真器时(或者如果我在测试运行时关闭它),测试就会挂起 我的目标是在发生类似情况时获得错误消息,而不是盲目等待。这能做到吗?如何做到 我的测试卡在以下命令中: DocumentClient .CreateDatabaseIfNotExistsAsync(ValidCosmoConfig.Database) .GetAwaiter()

我有几个单元测试(C#),用于初始化数据库和两个随机数据集合,以便在Cosmos DB emulator中进行测试。我的问题是,当我还没有启动仿真器时(或者如果我在测试运行时关闭它),测试就会挂起

我的目标是在发生类似情况时获得错误消息,而不是盲目等待。这能做到吗?如何做到

我的测试卡在以下命令中:

DocumentClient
    .CreateDatabaseIfNotExistsAsync(ValidCosmoConfig.Database)
    .GetAwaiter()
    .GetResult();

当我尝试在模拟器未运行时连接到模拟器时,我看到一条带有消息的
Microsoft.Azure.Cosmos.CosmosException
“响应状态代码不表示成功:InternalServerError(500);子状态:0;ActivityId:00000000-0000-0000-0000-000000000000;原因:(由于目标计算机主动拒绝,无法建立连接。);”

内部异常是
System.Net.Sockets.SocketException
(消息“无法建立连接,因为目标计算机主动拒绝它。”)


根据您的单元测试库,可能会在检测到此错误时完全中止此错误。

当我尝试在模拟器未运行时连接到模拟器时,我看到一个带有消息的
Microsoft.Azure.Cosmos.CosmosException
“响应状态代码不表示成功:InternalServerError(500);子状态:0;ActivityId:00000000-0000-0000-0000-000000000000;原因:(由于目标计算机主动拒绝,无法建立连接。);”

内部异常是
System.Net.Sockets.SocketException
(消息“无法建立连接,因为目标计算机主动拒绝它。”)


根据您的单元测试库的不同,在检测到此错误的情况下,可能会完全中止此错误。

我找到的唯一解决方案是在Cosmos DB emulator未运行时终止单元测试,它是在所有其他代码之前使用以下代码:

var source = new CancellationTokenSource(ValidCosmoConfig.RequestTimeout);
try
{
    DocumentClient.OpenAsync(source.Token).GetAwaiter().GetResult();
}
catch (Exception e)
{
    Console.WriteLine(e);
    Environment.Exit(0);
}

OpenAsync
确实抛出了一个异常,我可以立即终止测试,但我仍然不明白为什么它会卡在
CreateDatabaseIfNotExistsAsync
中,也不知道我设置的超时选项为什么不起作用。

我找到的唯一解决方案是在Cosmos DB emulator未运行时终止单元测试,它是在所有操作之前使用以下代码:

var source = new CancellationTokenSource(ValidCosmoConfig.RequestTimeout);
try
{
    DocumentClient.OpenAsync(source.Token).GetAwaiter().GetResult();
}
catch (Exception e)
{
    Console.WriteLine(e);
    Environment.Exit(0);
}


OpenAsync
确实抛出了一个异常,我可以立即终止测试,但我仍然不明白为什么它会卡在
CreateDatabaseIfNotExistsAsync
中,也不明白为什么我设置的超时选项不起作用。

我没有得到任何回报。第一个被调用的方法,程序在那里运行,是
createDatabaseIfNoteExistsAsync
。您使用的单元测试框架只是将异常转换为测试失败吗?它根本不会抛出任何东西。它只是卡在那里,我必须杀了它。到目前为止,我找到的唯一解决方案是在开始时使用
OpenAsync
,并在抛出错误时退出。由于未知的原因,超时似乎根本不起作用。我更新了一点我的问题,并发布了一个答案,如果他们能帮你一点忙的话。我没有得到任何回报。第一个被调用的方法,程序在那里运行,是
createDatabaseIfNoteExistsAsync
。您使用的单元测试框架只是将异常转换为测试失败吗?它根本不会抛出任何东西。它只是卡在那里,我必须杀了它。到目前为止,我找到的唯一解决方案是在开始时使用
OpenAsync
,并在抛出错误时退出。由于未知的原因,超时似乎根本不起作用。我更新了一点我的问题,并发布了一个答案,如果他们能帮你一点忙的话。异步同步是一种反模式,因为它会导致奇怪的边缘情况。如果你的单元测试框架不能处理异步方法,你需要一个更好的框架。你能提供更多信息吗?我目前正在运行在基本测试类的构造函数中设置的db,它不能声明为async。你有什么建议吗?我会在需要的时候进行DB连接,这样可以避免在需要之前添加等待(特别是在从不需要的情况下)。我明白了,但现在我们回到最初的问题。这似乎有助于我在数据库未运行时停止程序,而不是在
createDatabaseIfNoteExistsAsync
中死机。我能做什么?通过网络连接到资源(即使完全在一台机器内部)的情况总是这样,必须给出响应时间(光速适用):远程机器可能很慢。在测试用例中,您可以查看是否正在运行仿真器,但这取决于仿真器中的更改是否会破坏您的测试。异步同步是一种反模式,因为它会导致奇怪的边缘情况。如果你的单元测试框架不能处理异步方法,你需要一个更好的框架。你能提供更多信息吗?我目前正在运行在基本测试类的构造函数中设置的db,它不能声明为async。你有什么建议吗?我会在需要的时候进行DB连接,这样可以避免在需要之前添加等待(特别是在从不需要的情况下)。我明白了,但现在我们回到最初的问题。这似乎有助于我在数据库未运行时停止程序,而不是在
createDatabaseIfNoteExistsAsync
中死机。我能做什么?通过网络连接到资源(即使完全在一台机器内部)的情况总是这样,必须给出响应时间(光速适用):远程机器可能很慢。在测试用例中,您可以查看是否正在运行仿真器,但这取决于仿真器中的更改是否会破坏您的测试。