Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何模拟Azure DocumentDB客户端库抛出的DocumentClientException?_C#_Unit Testing_Azure Cosmosdb - Fatal编程技术网

C# 如何模拟Azure DocumentDB客户端库抛出的DocumentClientException?

C# 如何模拟Azure DocumentDB客户端库抛出的DocumentClientException?,c#,unit-testing,azure-cosmosdb,C#,Unit Testing,Azure Cosmosdb,我正试图围绕查询Azure文档数据库的代码编写一些单元测试。特别是,我试图确保错误处理工作正常。唯一的困难是,我无法模拟客户端库在从DocumentDB收到错误时抛出的DocumentClientException类DocumentClientException实现了ISerializable,因此当我尝试模拟它(使用Moq)时,我得到一个异常,表示模拟对象未能提供反序列化构造函数 是否有人成功模拟Azure DocumentDB文档客户端异常?如果是,你是怎么做到的?还是我的测试策略完全关闭了

我正试图围绕查询Azure文档数据库的代码编写一些单元测试。特别是,我试图确保错误处理工作正常。唯一的困难是,我无法模拟客户端库在从DocumentDB收到错误时抛出的
DocumentClientException
DocumentClientException
实现了
ISerializable
,因此当我尝试模拟它(使用Moq)时,我得到一个异常,表示模拟对象未能提供反序列化构造函数


是否有人成功模拟Azure DocumentDB文档客户端异常?如果是,你是怎么做到的?还是我的测试策略完全关闭了?

您的单元测试代码不应该连接到真正的Azure DocumentDb

将Azure客户端类包装在接口中,并在具体类的方法中调用DocumentDB。这是你真正的代码

当您对这个方法的调用者类进行单元测试时,模拟包装器接口,将其注入正在测试的类中,并在Moq设置中自己抛出DocumentClientException。并测试场景

因为DocumentClientException只有内部构造函数,所以有一个使用反射构造它的测试方法是值得的。(这当然是一个性能问题,但作为测试代码,您可以选择可测试性而不是几毫秒)

然后让打电话的人把它们当作

        var error = new Error
        {
            Id = Guid.NewGuid().ToString(),
            Code = "some_code",
            Message = "some_message"
        };


        var testException = CreateDocumentClientExceptionForTesting(error, 
                                           HttpStatusCode.InternalServerError);

        // make Moq throw testException

我都做过了。然而,当我遇到节流问题时,Azure DocumentDB将抛出DocumentClientException。我想测试我的代码在被DocumentDB限制时的行为是否正确。我还应该注意,您不能自己构造DocumentClientException-构造函数是Microsoft.Azure.Documents.oh yeah.的内部构造函数。。我忘了那个家伙只有内部构造师。。使用我通常在测试项目中使用的助手方法修改了答案感谢您的帮助。内省起了作用。你是对的。这是测试代码,所以我不担心性能。谢谢Raja!您知道如何使用您的解决方案从DocumentClientException设置RetryAfter属性吗?这太棒了!
        var error = new Error
        {
            Id = Guid.NewGuid().ToString(),
            Code = "some_code",
            Message = "some_message"
        };


        var testException = CreateDocumentClientExceptionForTesting(error, 
                                           HttpStatusCode.InternalServerError);

        // make Moq throw testException