asp.net-mvc - 我如何对这个业务逻辑进行单元测试?

标签 asp.net-mvc unit-testing moq

我有一个方法确实接受一个对象并将其保存到数据库中。但是,在保存对象之前,我执行以下操作...

(伪代码)

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/

相关文章:

asp.net-mvc - asp.net MVC 4 SSN 验证

c# - ASP 标识角色不存在错误

unit-testing - CPPUnit 与 CPPUnit2

entity-framework - 如何在 N 层架构中模拟 Entity Framework

c# - 是否有不需要虚拟方法的.NET/C# 模拟框架

c# - 如何更改被 mock 的对象?

asp.net-mvc - 将数据发回 ASP.NET MVC 子操作

c# - 在 ASP.NET MVC 中编辑订单详细信息

javascript - 如何清除 Jest 模拟实现以进行下一步测试?

Android Espresso 测试 : how test an activity's onNewIntent?