Я работаю над макетом поведения, связанного с библиотекой StackExchange.Redis, но не могу понять, как правильно имитировать закрытые классы, которые он использует. Конкретный пример в моем вызывающем коде, я делаю что-то вроде этого:
var cachable = command as IRedisCacheable;
if (_cache.Multiplexer.IsConnected == false)
{
_logger.Debug("Not using the cache because the connection is not available");
cacheAvailable = false;
}
else if (cachable == null)
{
Ключевая строка там - _cache.Multiplexer.IsConnected, где я проверяю, чтобы убедиться, что у меня есть действующее соединение, прежде чем использовать кеш. Поэтому в своих тестах я хочу смоделировать это поведение примерно так:
_mockCache = new Mock<IDatabase>();
_mockCache.Setup(cache => cache.Multiplexer.IsConnected).Returns(false);
Однако, хотя этот код компилируется нормально, я получаю эту ошибку при запуске теста:
Я также попытался издеваться над самим классом мультиплексора и предоставить это своему фиктивному кешу, но я столкнулся с тем фактом, что класс мультиплексора запечатан:
_mockCache = new Mock<IDatabase>();
var mockMultiplexer = new Mock<ConnectionMultiplexer>();
mockMultiplexer.Setup(c => c.IsConnected).Returns(false);
_mockCache.Setup(cache => cache.Multiplexer).Returns(mockMultiplexer.Object);
... но это приводит к этой ошибке:
В конечном итоге я хочу контролировать, является ли это свойство истинным или ложным в моих тестах, так есть ли правильный способ смоделировать что-то вроде этого?