我正在使用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静态方法吗?
答案 0 :(得分:0)
问题是,为什么需要静态方法?您不应使用与其他依赖项通信的静态方法。他们最多应该根据自己的属性和价值观来工作。如果是这样,则不必模拟它们。使用适当的类并将其注入所有其他依赖项。