【问题标题】:How to mock static method in c#? [duplicate]如何在 C# 中模拟静态方法? [复制]
【发布时间】:2019-09-26 22:50:42
【问题描述】:

我正在使用 xUnit 编写测试用例。我正在测试控制器。下面是我的控制器。

public IActionResult UpdateOption([FromBody] OptionsUpdate optionsUpdate)
{
  var updatingUser = userResolver.GetUserNameFromController(this);
  try
  {
    OptionsUpdate optionsUpdateData = DataParser.MakeDateConsistent(optionsUpdate);
    optionService.Update(optionsUpdateData, updatingUser);
    return Ok();
  }
  catch (Exception e)
  {
    log.Error(e, "Failed to update option parameters");
    return BadRequest();
  }
}

下面是我的测试方法。

[Fact]
public void OnSuccess_ShouldBeOk()
{
  controller.GetDependency<IOptionService>()
    .Update(Arg.Any<OptionsUpdate>(), Arg.Any<string>());

  var result = controller.Target.UpdateOption(new OptionsUpdate()) as StatusCodeResult;
  result.StatusCode.ShouldBe(200);
}

在上面的代码中,当单元测试用例在下面的代码行编写时抛出错误。

 OptionsUpdate optionsUpdateData = DataParser.MakeDateConsistent(optionsUpdate);

下面是MakeDateConsistent的实现

public static OptionsUpdate MakeDateConsistent(OptionsUpdate optionsUpdate)
{
  optionsUpdate.Values[Constants.OptionStoreUpdateKeys.OnRangeDate] = ConvertDDMMYYYYToYYYYMMDD(optionsUpdate.Values[Constants.OptionStoreUpdateKeys.OnRangeDate]);
  if (optionsUpdate.Values.ContainsKey(Constants.OptionStoreUpdateKeys.OffRangeDate))
  {
    if (optionsUpdate.Values[Constants.OptionStoreUpdateKeys.OffRangeDate] != string.Empty)
    {
      optionsUpdate.Values[Constants.OptionStoreUpdateKeys.OffRangeDate] = ConvertDDMMYYYYToYYYYMMDD(optionsUpdate.Values[Constants.OptionStoreUpdateKeys.OffRangeDate]);
    }
  }

  return optionsUpdate;
}

我编辑了我的代码如下。

var rawUpdate = new OptionsUpdate()
        {
          Keys = new List<OptionStore>()
        {
          new OptionStore() { Option = optionId, Store = store.ToString() }
        },
          Values = new Dictionary<string, string>()
        {
          { Constants.OptionStoreUpdateKeys.Lspl, lspl.ToString() },
          { Constants.OptionStoreUpdateKeys.OnRangeDate, "01/01/2018" },
        }
        };
        DataParser.MakeDateConsistent(rawUpdate).Returns(rawUpdate);

这是抛出错误

NSubstitute.Exceptions.CouldNotSetReturnDueToTypeMismatchException: 'Can not return value of type OptionsUpdate for IOptionService.Update (expected type Int32).

我不想创建任何接口来测试它。 有人可以帮我模拟 MakeDateConsistent 静态方法吗?

【问题讨论】:

  • 请添加错误信息和stacktrace。
  • 它可能会在options.Values 上引发 NullReferenceException?
  • 谢谢。是的,它会抛出未设置为实例的对象错误。
  • 我没有看到任何模拟该方法的理由 - 它是纯函数,除了参数之外不接受任何输入并且没有状态。传递可接受的参数而不是试图模拟它应该很好(但既然你问过我会找到好的副本)
  • 好的,如果我不必模拟它,那么我应该怎么做才能避免错误?

标签: c# .net


【解决方案1】:

问题是,为什么需要静态方法?您不应该使用与其他依赖项对话的静态方法。他们最多应该在自己的属性和价值观上工作。如果他们这样做,您不必嘲笑他们。使用适当的类并将其注入所有其他依赖项。

【讨论】:

  • 谢谢。你能给我举个例子吗?
  • @Niranjan 检查顶部链接问题的答案
  • 链接没有回答我的问题。
  • 什么是controller.Target?测试应该在某处说 controller.UpdateOption(..)
  • 私有只读 MockProvider.TestTarget 控制器;
猜你喜欢
  • 2020-08-23
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 2010-09-14
相关资源
最近更新 更多