无法 运行 测试在 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();
}
我无法 运行 测试在 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();
}