如何模拟 Azure DocumentDB 客户端库引发的 DocumentClientException
本文关键字:客户端 DocumentClientException DocumentDB Azure 何模拟 模拟 | 更新日期: 2023-09-27 18:36:10
我正在尝试围绕查询 Azure 文档数据库的代码编写一些单元测试。特别是,我正在尝试确保错误处理正常工作。唯一的困难是我无法模拟客户端库在收到来自 DocumentDB 的错误时抛出的 DocumentClientException
类。 DocumentClientException
实现了ISerializable
,所以当我尝试模拟它(使用 Moq)时,我得到一个异常,说模拟对象未能提供反序列化构造函数。
有没有人成功模拟了 Azure DocumentDB 文档客户端异常?如果是这样,你是怎么做到的?还是我的测试策略完全错误?
单元测试代码不应连接到真正的 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