【问题标题】:Returning different mocked values based on parameters passed in Unit Test with Moq根据在单元测试中使用 Moq 传递的参数返回不同的模拟值
【发布时间】:2014-11-01 09:52:26
【问题描述】:

我有一个名为 GetTasks() 的方法,它返回 10 个任务对象。我想将此任务最小起订量用于单元测试目的。代码如下:

 _crateRecallService.Setup(m => m.GetTasks(It.IsAny<int>(), It.IsAny<List<Stage>>(), It.IsAny<List<Severity>>())).Returns(new List<CrateRecallTaskWithComms>()
{
    new CrateRecallTaskWithComms() { CrateRecallTas = new CrateRecallTas() { CrateId = "1", PkCTaskID = 1, CampaignId = 1, Severity = "High"}},
    new CrateRecallTaskWithComms() { CrateRecallTas = new CrateRecallTas() { CrateId = "2", PkCTaskID = 2, CampaignId = 2, Severity = "High"}},
    new CrateRecallTaskWithComms() { CrateRecallTas = new CrateRecallTas() { CrateId = "3", PkCTaskID = 3, CampaignId = 3, Severity = "High"}},
    new CrateRecallTaskWithComms() { CrateRecallTas = new CrateRecallTas() { CrateId = "4", PkCTaskID = 4, CampaignId = 4}},
    new CrateRecallTaskWithComms() { CrateRecallTas = new CrateRecallTas() { CrateId = "5", PkCTaskID = 5, CampaignId = 5}},
    new CrateRecallTaskWithComms() { CrateRecallTas = new CrateRecallTas() { CrateId = "6", PkCTaskID = 6, CampaignId = 6}},
    new CrateRecallTaskWithComms() { CrateRecallTas = new CrateRecallTas() { CrateId = "7", PkCTaskID = 7, CampaignId = 7}},
    new CrateRecallTaskWithComms() { CrateRecallTas = new CrateRecallTas() { CrateId = "8", PkCTaskID = 8, CampaignId = 8}},
    new CrateRecallTaskWithComms() { CrateRecallTas = new CrateRecallTas() { CrateId = "9", PkCTaskID = 9, CampaignId = 9}},
    new CrateRecallTaskWithComms() { CrateRecallTas = new CrateRecallTas() { CrateId = "10", PkCTaskID = 10, CampaignId = 10}}

});

这工作正常,但缺少一些东西。过滤任务严重性在这里不起作用。

我的问题是,我如何设置最小起订量,以便如果传入的严重性列表具有高严重性,它将返回 3 而不是 10 个任务?所以换句话说,如果我通过它:

// Arrange
var severities = new List<Severity>() { Severity.High };

我想返回 3 个任务而不是 10 个。

【问题讨论】:

    标签: c# asp.net .net unit-testing moq


    【解决方案1】:

    Returns 不仅接受一个值,而且您还可以传递具有精确签名的委托,因为您的方法和实际参数将传递给委托。然后,您可以使用这些参数做任何您想做的事情。你的情况

     .Returns( (int i, List<Stage> stages, List<Severity> severities) =>
              {
                  if ( severities.Contains(...) 
                     return ...
                  else
                     ...
              } );
    

    【讨论】:

    • 请注意,使用返回明显类型的 lambda,例如 .Returns(arg =&gt; $"constantpart/{arg}") 可能需要您通过 .Returns&lt;string&gt;(arg =&gt; $"constantpart/{arg}") 帮助类型推理系统
    • @TetsujinnoOni:或者,就像我的回答一样,您将显式类型放在 lambda 的参数列表中,而不是按照您的建议放在泛型类型参数列表中。换句话说,我的回答已经在签名中提到了明确的类型。
    猜你喜欢
    • 2016-12-06
    • 1970-01-01
    • 2020-12-07
    • 2023-03-29
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    相关资源
    最近更新 更多