我有一个方法确实接受一个对象并将其保存到数据库中。但是,在保存对象之前,我执行以下操作...
(伪代码)
if (IsAuthenticated)
{
foo.UserId = AuthenticatedUser.Id;
}
else
{
foo.AnonEmail = "Jon@World-Domination";
foo.AnonName = "Jon Skeet";
}
try
{
_fooService.Save(foo);
}
catch
{
// Some view, with error stuff now added to
return View(...); ViewData.ModelState.
}
// all good, redirect to the proper next view.
return RedirectToAction(...);
该代码工作正常,但我不确定如何编写两个单元测试才能成功。 a) 用户使用有效数据进行身份验证 b) 用户未使用有效数据进行身份验证。
我不确定该怎么做的原因是,这两种情况都返回相同的 RedirectToAction(..) View 对象。所以我可以成功测试 .. 但它没有告诉我保存的对象是否包含经过身份验证的用户 ID 或匿名信息。这就像我想要第一个单元测试说
- 起订一个经过身份验证的用户
- 调用方法
- 测试结果是否为 RedirectToActionView
- 测试持久化的 foo 对象是否包含最小起订量的用户 ID。
想法?
更新
常见的建议是我模拟 fooService。我目前正在使用依赖注入(inject)和最小起订量,所以有人可以告诉我如何使用最小起订量吗?不过,我不确定 DI 在这里有多重要???
最佳答案
我会模拟 _fooService
对象,并在您的测试中测试它接收到的内容。这样,您周围的代码将保持不变并且不会受到影响,并且通过检查 _fooService
接收到的内容,您可以断言行为是否符合预期。在这种情况下,返回对象并不重要。
你如何模拟你的 _fooService
?您可以实现自己的“测试”版本(坚持与真实世界版本相同的界面),或使用模拟框架。无论您使用哪种方法,您上面的代码都需要使用 _fooService
的给定实现进行配置(通常在构建时 - 请参阅 dependency injection 以获取有关其工作原理的更多信息)
关于asp.net-mvc - 我如何对这个业务逻辑进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/725608/