【问题标题】:Return values set on for-loop/foreach loop在 for-loop/foreach 循环上设置的返回值
【发布时间】:2015-05-22 07:25:10
【问题描述】:

我是 Moq 的新手,我能够模拟一些场景,例如返回列表或对象。我遇到了这个问题,我需要在循环中从GetNoteBookTypeAndProcess 返回不同的值。在下面的示例中,我模拟了 GetNoteBooks 方法并返回 NoteBook 对象列表(这里没有问题)。 现在在 foreach 循环中,我模拟了这个方法 GetNoteBookTypeAndProcess 并返回一个字符串(芯片组)。 但我需要的是根据我设置的模拟(循环)返回不同的芯片组。目前我只能返回 1,它返回 50 的值。

我还复制并粘贴了相同的设置,但 GetNoteBookTypeAndProcess 的返回不同,但仍然没有运气。

var results = GetNoteBooks(); //database call
var chipset = new List<string>();

foreach (var items in results)
{
    var result = GetNoteBookTypeAndProcess(items.OrderNum);
    chipset.Add(result);
}

模拟单元测试

        mock.Setup(m => m.GetNoteBooks()).Returns(new List<NoteBook>()
        {
            new NoteBook { OrderNum = 1, Price = 1000, Type = 50 },
            new NoteBook { OrderNum = 2, Price = 2000, Type = 51 },
            new NoteBook { OrderNum = 3, Price = 3000, Type = 52 }
        });

        mock.Setup(m => m.GetNoteBookTypeAndProcess(OrderNum)).Returns(50);

【问题讨论】:

  • 您可以多次调用Setup 以获得相同的模拟,并根据提供的输入返回不同的值。是你想要的吗?
  • 或者看看Returns&lt;T&gt;(Func&lt;T, TResult&gt;)overload
  • @Uriil,是的,我想我可以通过安装程序多次完成。谢谢。我认为我必须对它做一些特别的事情。
  • @WillSmith,你能给我举个例子来说明你的意思吗?谢谢,真的很感激。

标签: c# moq


【解决方案1】:

您可以使用Returns&lt;T&gt;(Func&lt;T, TResult&gt;) overload

var data = new List<NoteBook>()
{
    new NoteBook { OrderNum = 1, Price = 1000, Type = 50 },
    new NoteBook { OrderNum = 2, Price = 2000, Type = 51 },
    new NoteBook { OrderNum = 3, Price = 3000, Type = 52 }
};

mock.Setup(m => m.GetNoteBooks()).Returns(data);
mock.Setup(m => m.GetNoteBookTypeAndProcess(It.IsAny<int>()))
    .Returns((int orderNumber) => data.Single(x => x.OrderNumber == orderNumber).Type);

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多