首页 > 解决方案 > 如果使用延迟执行初始化一组 Mock 对象,则 Moq 验证不起作用

问题描述

我要模拟的界面

interface Proxy
{
    Task Send();
}

用法

class MultiProxy
{
    IEnumerable<Proxy> _proxies;
    MultiProxy(IEnumerable<Proxy> proxies)
    { _proxies = proxies; }

    async Task Send()
    {
        _proxies.Select(proxy => proxy.Send());
    }

    // The test method written here for convenience
    private async Task Mock()
    {
        var mocks = Enumerable.Range(0, 2)
            .Select(_ =>
            {
                var mock = new Mock<Proxy>();
                mock.Setup(proxy => proxy.Send())
                    .Returns(Task.CompletedTask);
                return mock;
            });
        //.ToList();
        var mockProxies = mocks.Select(mock => mock.Object);
        var mulProxies = new MultiProxy(mockProxies);

        await mulProxies.Send();

        foreach (var mock in mocks)
        {
            mock.Verify(proxy => proxy.Send(), Times.Once);
        }
    }
}

Mock()方法将失败。
但是,如果我取消注释,ToList()那么该Mock()方法将成功。

我想知道为什么会这样。

起订量版本:4.14.5

标签: asp.net-coremoq

解决方案


推荐阅读