如何使用Moq模拟StackExchange.Redis库抛出的异常?
How to use Moq to simulate exceptions thrown by the StackExchange.Redis library?
我正在做一个项目,我想在其中使用 StackExchange.Redis 库连接到 Redis 数据库。此外,我想在我们的单元测试中将 Moq 用于模拟库,但我 运行 遇到了障碍,我需要一些帮助来解决。
我的具体问题是,我有一个 command/response 架构,我正在尝试测试缓存 "wrapper",它会在执行实际工作之前检查缓存是否可以满足命令到 return 响应。一个重要的考虑因素是缓存故障永远不应停止处理请求,因此我想模拟 StackExchange.Redis IDatabase 接口的某些故障。但是,我似乎无法弄清楚如何从我的模拟对象中抛出 RedisException。例如,我想只使用下面的代码,但它没有编译,因为没有 public 构造函数来处理这个库抛出的异常。
Mock<IDatabase> _mockCache = new Mock<IDatabase>();
// Simulate a connection exception to validate how the cache layer handles it
// THIS DOESN'T COMPILE THOUGH
//
_mockCache.Setup(cache => cache.StringGetAsync("a", CommandFlags.None)).Throws<RedisException>();
是否有更好的方法来模拟 StackExchange.Redis 库中的故障?我觉得我在最小起订量或如何针对该库进行测试时遗漏了一些明显的东西。
您始终可以使用 FormatterServices.GetUninitializedObject
创建 class 的实例,而无需 运行 任何构造函数:
Creates a new instance of the specified object type.
Because the new instance of the object is initialized to zero and no constructors are run, the object might not represent a state that is regarded as valid by that object. The current method should only be used for deserialization when the user intends to immediately populate all fields. It does not create an uninitialized string, since creating an empty instance of an immutable type serves no purpose.
因此您的设置可能如下所示:
var e = (RedisException)FormatterServices.GetUninitializedObject(typeof(RedisException));
Mock<IDatabase> _mockCache = new Mock<IDatabase>();
_mockCache.Setup(cache => cache.StringGetAsync("a", CommandFlags.None)).Throws(e);
有点老套;由于没有构造函数 运行,因此您不应依赖 RedisException
实例的有效状态。
我正在做一个项目,我想在其中使用 StackExchange.Redis 库连接到 Redis 数据库。此外,我想在我们的单元测试中将 Moq 用于模拟库,但我 运行 遇到了障碍,我需要一些帮助来解决。
我的具体问题是,我有一个 command/response 架构,我正在尝试测试缓存 "wrapper",它会在执行实际工作之前检查缓存是否可以满足命令到 return 响应。一个重要的考虑因素是缓存故障永远不应停止处理请求,因此我想模拟 StackExchange.Redis IDatabase 接口的某些故障。但是,我似乎无法弄清楚如何从我的模拟对象中抛出 RedisException。例如,我想只使用下面的代码,但它没有编译,因为没有 public 构造函数来处理这个库抛出的异常。
Mock<IDatabase> _mockCache = new Mock<IDatabase>();
// Simulate a connection exception to validate how the cache layer handles it
// THIS DOESN'T COMPILE THOUGH
//
_mockCache.Setup(cache => cache.StringGetAsync("a", CommandFlags.None)).Throws<RedisException>();
是否有更好的方法来模拟 StackExchange.Redis 库中的故障?我觉得我在最小起订量或如何针对该库进行测试时遗漏了一些明显的东西。
您始终可以使用 FormatterServices.GetUninitializedObject
创建 class 的实例,而无需 运行 任何构造函数:
Creates a new instance of the specified object type.
Because the new instance of the object is initialized to zero and no constructors are run, the object might not represent a state that is regarded as valid by that object. The current method should only be used for deserialization when the user intends to immediately populate all fields. It does not create an uninitialized string, since creating an empty instance of an immutable type serves no purpose.
因此您的设置可能如下所示:
var e = (RedisException)FormatterServices.GetUninitializedObject(typeof(RedisException));
Mock<IDatabase> _mockCache = new Mock<IDatabase>();
_mockCache.Setup(cache => cache.StringGetAsync("a", CommandFlags.None)).Throws(e);
有点老套;由于没有构造函数 运行,因此您不应依赖 RedisException
实例的有效状态。