针对生产数据库进行单元测试的做法是不可取的,因为会对数据库中的数据造成影响。正确的做法是使用“内存数据库”(In-Memory database)或者模拟数据来执行测试。以下是在ASP.NET Core Web API中使用“内存数据库”进行单元测试的示例代码:
public class TestDbContext : DbContext
{
public TestDbContext(DbContextOptions options)
: base(options)
{
}
public DbSet Users { get; set; }
}
[TestMethod]
public async Task GetUserById_ReturnsUser()
{
var options = new DbContextOptionsBuilder()
.UseInMemoryDatabase(databaseName: "TestDatabase")
.Options;
// Insert test data into the "database"
using (var context = new TestDbContext(options))
{
context.Users.Add(new User { Id = 1, Name = "John Smith" });
await context.SaveChangesAsync();
}
// Run the test
using (var context = new TestDbContext(options))
{
var controller = new UsersController(context);
var result = await controller.GetUserById(1);
// Assert that the expected user was returned
Assert.AreEqual("John Smith", result.Value.Name);
}
}
另一种解决方案是使用仓库层(Repository Layer),这可将数据库访问逻辑隔离到一个单独的层级中,从而使测试更容易进行。以下是在ASP.NET Core Web API中使用仓库层进行单元测试的示例代码:
public interface IUserRepository
{
Task GetById(int id);
}
public class UserRepository : IUserRepository
{
private readonly TestDbContext _context;
public UserRepository(TestDbContext context)
{
_context = context;
}
public Task GetById(int id)
{
return _context.Users.FindAsync(id);
}
}
[TestMethod]
public async Task GetUserById_ReturnsUser()
{
var options = new DbContextOptionsBuilder()
.UseInMemoryDatabase