如何模拟 Azure DocumentDB 客户端库引发的 DocumentClientException

本文关键字:客户端 DocumentClientException DocumentDB Azure 何模拟 模拟 | 更新日期: 2023-09-27 18:36:10

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

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

如何模拟 Azure DocumentDB 客户端库引发的 DocumentClientException

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

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

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

由于 DocumentClientException 只有内部构造函数,因此值得使用一种测试方法来使用反射来构造它。(这肯定是一个性能命中,但作为测试代码,您可以选择可测试性而不是几毫秒)

private static DocumentClientException CreateDocumentClientExceptionForTesting(
                                               Error error, HttpStatusCode httpStatusCode)
{
    var type = typeof (DocumentClientException);
    // we are using the overload with 3 parameters (error, responseheaders, statuscode)
    // use any one appropriate for you.
    var documentClientExceptionInstance = type.Assembly.CreateInstance(type.FullName, 
        false, BindingFlags.Instance | BindingFlags.NonPublic, null,
        new object[] {error, (HttpResponseHeaders) null, httpStatusCode}, null, null);
    return (DocumentClientException)documentClientExceptionInstance;
}

然后让呼叫者将它们用作,

var error = new Error
{
    Id = Guid.NewGuid().ToString(),
    Code = "some_code",
    Message = "some_message"
};
var testException = CreateDocumentClientExceptionForTesting(error, HttpStatusCode.InternalServerError);
// make Moq throw testException