c# - 在 NSubstitute 中使用 IEnumerable 设置参数匹配器

我正在为一个项目进行单元测试,但我不知道如何让 NSubstitute 以我期望的方式工作。我遇到的问题是,我要替换的代码在一个 while 循环中,并且根据从替换值返回的内容来确定循环是否继续。

我想做的是让 Process() 根据传入的内容返回不同的结果。我试过了

api.Process(Arg.Is<IEnumerable<int>>(new[] {1,2,3}, Arg.Any<bool>()).Returns(new ProcessingResult(){Success = true, IdsNotProcessed = List<int>{30}});

但它似乎不起作用,因为 processingResult 返回 null,因为 NSubstitue 与参数不匹配。

    [Test]
    public void TestTwoLoops()
    {
        var api = Substitute.For<IApi>();
        api.Process(/*list containing 1,2,3*/, Arg.Any<bool>()).Returns(new ProcessingResult(){Success = true, IdsNotProcessed = List<int>{30}});
        api.Process(/*list containing 30*/, Arg.Any<bool>()).Returns(new List<int>{});

        var sut = new WidgetMaker(api);

        sut.MakeWidget();
    }

    public class WidgetMaker
    {
        public WidgetMaker(IApi api)
        {
            _api = api;
        }

        public void MakeWidgets(IEnumerable<int> widgetIds)
        {
            var idsToProcess = widgetIds.ToList();

            while(true)
            {
                if(!idsToProcess.Any())
                {
                    berak;
                }

                var processingResult = _api.Process(idsToProcess, false);

                if(processingResult.Success)
                {
                    idsToProcess.Clear();
                    idsToProcess.AddRange(processingResult.IdsNotProcessed);
                }
                else
                {
                    break;
                }
            }
        }

        private IApi _api;
    }

最佳答案

在我写这个问题的时候,我想到了答案,但我觉得其他人可能会觉得这有帮助。

使用接受谓词的重载并使用参数为 new[] 的 SequenceEqualExtension 方法{/我想输入的值

api.Process(Arg.Is<IEnumerable<int>>(x => x.SequenceEqual(new[] {1,2,3}, Arg.Any<bool>())).Returns(new ProcessingResult(){Success = true, IdsNotProcessed = List<int>{30}});

https://stackoverflow.com/questions/42563640/

相关文章:

date - 如何将天数添加到 Cypher 中的日期属性?

python - Django makemessages 写假文件

spring-boot - 将所有 Zuul 代理请求动态重新路由到单个 URL

php - 所有链接都重定向到 localhost/dashboard/with codeignit

php - laravel blade 使用 substr 方法禁用转义

spring-mvc - spring-boot自定义404错误页面

indexing - solr 的 WSO2 API 管理器问题

elixir - 在 Ecto 中加载树状结构

sql - Oracle SYSDATE 格式更改

css - 使用过多的字体声明是否会对性能产生影响?