【发布时间】: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? -
谢谢。是的,它会抛出未设置为实例的对象错误。
-
我没有看到任何模拟该方法的理由 - 它是纯函数,除了参数之外不接受任何输入并且没有状态。传递可接受的参数而不是试图模拟它应该很好(但既然你问过我会找到好的副本)
-
好的,如果我不必模拟它,那么我应该怎么做才能避免错误?