Redis StringSetAsync在使用Moq的单元测试中返回false

问题描述

我目前正在为我的解决方案的RedisProvider类编写单元测试。我的班级中有一个方法可以在Redis缓存中设置密钥:

public async Task<bool> StringSetAsync(string key,string value)
{
   var cache = multiplexer.GetDatabase();
   //Some other stuff
   result = await cache.StringSetAsync(key,value);
   return result;
}

在单元测试中,我具有以下设置:

   var mockMultiplexer = new Mock<IConnectionMultiplexer>();

   mockMultiplexer.Setup(_ => _.IsConnected).Returns(true);
   mockMultiplexer.Setup(_ => _.Configuration).Returns(MockedData.CacheConnectionString);

   var mockDatabase = new Mock<IDatabase>();

   mockMultiplexer
         .Setup(_ => _.GetDatabase(It.IsAny<int>(),It.IsAny<object>()))
         .Returns(() => mockDatabase.Object);

   RedisCacheProvider mockedCacheProvider = new RedisCacheProvider(new Mock<ILogger<RedisCacheProvider>> 
 ().Object,mockMultiplexer.Object);

   var result = await mockedCacheProvider.StringSetAsync(It.IsAny<string>(),It.IsAny<string>());

当我为单元测试运行以上代码时,收到的结果始终为false。有没有办法得到真实的结果?这是怎么了?

解决方法

我意识到服务应该使用类来嘲笑它,而不是在类本身上对此进行验证。

您在这里:

            mockedCacheProvider.Setup(h => h.StringSetAsync(
                 It.IsAny<string>(),It.IsAny<string>())).ReturnsAsync(() => true);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...