【问题标题】:Unit test for redis cacheredis缓存的单元测试
【发布时间】:2021-07-15 10:25:04
【问题描述】:

我正在尝试为以下代码编写单元测试,但无法

运行时显示以下错误信息。

消息: 测试方法 DemoService.UnitTest.Common.RedisCacheTests.RemoveAllAsyncTest.WhenTheMethodIsInvoked_ShouldRemoveAllKey 抛出异常: Moq.MockException:IAsyncEnumerable.GetAsyncEnumerator(CancellationToken) 调用失败,模拟行为严格。 模拟上的所有调用都必须有相应的设置。

C#代码

var keys = await _redisConnection.GetServer(endPoint)
                    .KeysAsync(pattern: cacheKey.ToString())
                    .ToListAsync();

对于上面的代码,我试图模拟如下

var mockServer = new Mock<IServer>(MockBehavior.Strict);
var mockRedisKey = new Mock<IAsyncEnumerable<RedisKey>>(MockBehavior.Strict);

mockServer.Setup(x => x.KeysAsync(It.IsAny<int>(), It.IsAny<RedisValue>(), It.IsAny<int>(), It.IsAny<long>(), It.IsAny<int>(), It.IsAny<CommandFlags>())).Returns(mockRedisKey.Object);

【问题讨论】:

  • 你的mockRedisKey 也需要为GetAsyncEnumerator() 设置,因为ToListAsync() 会调用它。

标签: c# unit-testing moq mstest


【解决方案1】:

我希望这会有所帮助。这就是我设置 KeysAsync() 的方式,它工作正常。 ToAsyncEnumerable() 来自下面的包。

dotnet 添加包System.Linq.Async --version 5.1.0

    [Fact]
    public async Task Success()
    {
        // Arrange
        var keys = new RedisKey[] { "key1", "key2", "key3", "key4" };

        var mockServer = Mock.Of<IServer>();

        Mock.Get(mockServer).Setup(_ =>
            _.KeysAsync(
                It.IsAny<int>(),
                It.IsAny<RedisValue>(),
                It.IsAny<int>(),
                It.IsAny<long>(),
                It.IsAny<int>(),
                It.IsAny<CommandFlags>())).Returns(keys.ToAsyncEnumerable());

        Mock.Get(_fixture.MockConnectionMultiplexer)
            .Setup(_ => _.GetServer(It.IsAny<EndPoint>(), It.IsAny<object>()))
            .Returns(mockServer);

        // Act
        var result = _fixture.RedisManager.GetAllKeys();

        // Assert
        var resultList = await result.ToListAsync();
        resultList.Count.Should().Be(4);
        resultList.ElementAt(3).Should().Be("key4");
    }

【讨论】:

    猜你喜欢
    • 2021-11-15
    • 2020-07-07
    • 2021-08-19
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2018-04-27
    • 2013-02-01
    • 1970-01-01
    相关资源
    最近更新 更多