【问题标题】:Asp.Net Core WebApi: Create Unit TestsAsp.Net Core WebApi:创建单元测试
【发布时间】:2018-05-29 07:33:43
【问题描述】:

我有一个 AccountController 类,这里是它的 ctor:

public AccountController(
            UserManager<User> userManager,
            SignInManager<User> signInManager,
            RoleService roleService,
            IConfiguration configuration)
        {
            _userManager = userManager;
            _signInManager = signInManager;
            _roleService = roleService;
            _configuration = configuration;
        }

RoleService 这是我自己的课程。

我创建了一个 xUnit Test 项目并使用 Entity Framework Core 来避免模拟和伪造数据库。我使用 UseInMemoryData 方法:

var options = new DbContextOptionsBuilder<ApplicationDbContext>()
                .UseInMemoryDatabase(Guid.NewGuid().ToString())
                .Options;
            var context = new ApplicationDbContext(options);

但我不明白如何测试 AccountController、女巫注入 UserManager&lt;User&gt;, SignInManager&lt;User&gt; 等等。如何创建 AccountController 类的实例?

【问题讨论】:

  • 您是否要进行完整的集成测试,即测试整个AccountController,包括数据库访问和http请求管道?
  • 您将创建该类的实例 - 这将为您的控制器提供完美的测试,您可以重构 alter 而无需重写所有测试

标签: c# unit-testing asp.net-core entity-framework-core xunit


【解决方案1】:

我通常不会为控制器创建单元测试,因为我们需要模拟很多东西,而且这是一项艰苦的工作。

如果您认为您的控制器仅调用另一段代码,例如应用程序服务或命令处理程序,您可以使用集成测试覆盖您的控制器,并为您的命令处理程序或应用程序服务或您拥有的任何层创建单元测试你的业务逻辑。

但也许如果你真的想为你的控制器创建一个单元测试,你需要使用像 Moq 这样的框架来创建一个你在控制器中需要的所有依赖项的模拟。

希望对你有所帮助:D

【讨论】:

  • 我们需要模拟很多东西然后你的控制器只调用另一段代码 - 这是否意味着你的服务或处理程序将有很多嘲笑?
  • @Fabio 当我们尝试创建控制器单元测试时,我们需要模拟诸如 HttpContext、IConfiguration 之类的东西以及我们的依赖项(例如存储库、域服务等)。如果您认为您的业务逻辑不应该在您的控制器中,那么您不需要为此创建单元测试。
  • 除非您从那里读取原始数据,否则您不需要模拟 HttpContext。存储库也将被业务逻辑对象使用,因此您也需要为您的业务逻辑对象模拟它。
  • 要进行单元测试,每次向某些公共方法添加参数时都不会重写 - 仅模拟使测试变慢的对象 - 数据库访问,文件系统其他外部资源。
  • 如果您需要模拟控制器中的所有内容,请考虑测试值,而不是测试具有值的东西,您将只测试模拟!当你可以测试所有集成的东西时,除非你在控制器中有业务逻辑。
猜你喜欢
  • 1970-01-01
  • 2020-07-30
  • 2012-06-07
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2021-10-10
相关资源
最近更新 更多