无法 运行 测试在 xUnit 中执行 Entity Framework 核心操作的控制器

Can't run tests for a controller doing Entity Framework Core operations in xUnit

我无法 运行 测试在 xUnit 中执行 Entity Framework 核心操作的控制器。我正在使用内存数据库,我得到的错误是:

**A test class may only define a single public constructor.**

测试class是:

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using MyAppT.Controllers;
using MyAppT.Models;
using Xunit;

namespace TestingProject
{

    public class TestRegistration
    {
        #region Seeding
        protected TestRegistration(DbContextOptions<AppDbContext> contextOptions)
        {
            ContextOptions = contextOptions;
            Seed();
        }

        protected DbContextOptions<AppDbContext> ContextOptions { get; }

        private void Seed()
        {
            using (var context = new AppDbContext(ContextOptions))
            {
                context.Database.EnsureDeleted();
                context.Database.EnsureCreated();

                var one = new Register()
                {
                    Name = "Test One",
                    Age = 40
                };

                var two = new Register()
                {
                    Name = "Test Two",
                    Age = 50
                };

                var three = new Register()
                {
                    Name = "Test Three",
                    Age = 60
                };
                context.AddRange(one, two, three);
                context.SaveChanges();
            }
        }
        #endregion

        [Fact]
        public void Test_Create_GET_ReturnsViewResultNullModel()
        {
            using (var context = new AppDbContext(ContextOptions))
            {
                // Arrange
                var controller = new RegistrationController(context);

                // Act
                var result = controller.Create();

                // Assert
                var viewResult = Assert.IsType<ViewResult>(result);
                Assert.Null(viewResult.ViewData.Model);
            }
        }
    }
}

执行 EF 核心操作的控制器是:

using Microsoft.AspNetCore.Mvc;
using MyAppT.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MyAppT.Controllers
{
    public class RegistrationController : Controller
    {
        private AppDbContext context;
        public RegistrationController(AppDbContext appDbContext)
        {
            context = appDbContext;
        }

        public IActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> Create(Register register)
        {
            if (ModelState.IsValid)
            {
                context.Add(register);
                await context.SaveChangesAsync();

                return RedirectToAction("Read");
            }
            else
                return View();
        }
    }
}

运行在测试资源管理器中显示测试时出现的奇怪错误 - 测试 class 可能只定义一个 public 构造函数。

我在 Whosebug 上找不到任何相关信息。请帮助修复它?

您的构造函数需要无参数才能工作,除非您在测试项目中使用某些 DI 框架,这通常是您不应该做的事情。 相反,请尝试在构造函数中创建 DBContextOptions 并将其分配给您的 class 变量。然后,您可以在为数据库播种时以及针对它进行测试时使用它。

试试这个。如果您还没有 Microsoft.EntityFrameworkCore.InMemory 包,则需要将其添加到您的测试项目中。

public class TestRegistration
{
    #region Seeding
    public TestRegistration()
    {
        ContextOptions = new DbContextOptionsBuilder<AppDbContext>()
              .UseInMemoryDatabase(databaseName: "Test")
              .Options;
        Seed();
    }