如何在C#中模拟静态方法?

时间:2019-05-09 06:49:11

标签: c# .net

我正在使用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静态方法吗?

1 个答案:

答案 0 :(得分:0)

问题是,为什么需要静态方法?您不应使用与其他依赖项通信的静态方法。他们最多应该根据自己的属性和价值观来工作。如果是这样,则不必模拟它们。使用适当的类并将其注入所有其他依赖项。