Я понимаю, что IMemoryCache.Set — это метод расширения, поэтому над ним нельзя издеваться. Люди предоставили обходные пути для такой ситуации, например, один от NKosi здесь. Мне интересно, как я могу добиться этого для своего уровня доступа к данным, где мой MemoryCache возвращает значение, а когда он не найден, он получает данные из базы данных, устанавливает его в MemoryCache и возвращает требуемое значение.
public string GetMessage(int code)
{
if(myMemoryCache.Get("Key") != null)
{
var messages= myMemoryCache.Get<IEnumerable<MyModel>>("Key");
return messages.Where(x => x.Code == code).FirstOrDefault().Message;
}
using (var connection = dbFactory.CreateConnection())
{
var cacheOptions = new MemoryCacheEntryOptions { SlidingExpiration = TimeSpan.FromHours(1) };
const string sql = @"SELECT Code, Message FROM MyTable";
var keyPairValueData = connection.Query<KeyPairValueData>(sql);
myMemoryCache.Set("Key", keyPairValueData, cacheOptions );
return keyPairValueData.Where(x => x.Code == code).FirstOrDefault().Message;
}
}
Ниже приведен мой модульный тест. И, конечно же, он не работает, так как я не могу издеваться над IMemoryCache.
[Fact]
public void GetMessage_ReturnsString()
{
//Arrange
// Inserting some data here to the InMemoryDB
var memoryCacheMock = new Mock<IMemoryCache>();
//Act
var result = new DataService(dbConnectionFactoryMock.Object, memoryCacheMock.Object).GetMessage(1000);
//assert xunit
Assert.Equal("Some message", result);
}