gpt4 book ai didi

c# - 如何在 xUnit 测试项目中使用 DbContext?

转载 作者:行者123 更新时间:2023-12-03 14:33:53 44 4
gpt4 key购买 nike

我为我的核心 1.0 应用程序添加了一个测试项目。在其中我有在构造函数中使用 dbContext 的存储库。

如何在测试项目中访问此 dbContext 并正确注入(inject)?

这是我的 ApplicationDbContext 类:

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}

protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}

public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<ShoppingCartItem> ShoppingCartItems { get; set; }
public DbSet<Order> Orders { get; set; }
public DbSet<OrderDetail> OrderDetails { get; set; }
}

这是我的单元测试方法:
[Fact]
public void ProductsGetAll()
{
//here i need to get acces to dbContext and inject it below

ProductRepository productRepository = new ProductRepository(dbContext);
CategoryRepository categoryRepository = new CategoryRepository(dbContext);
ProductController productController = new ProductController(productRepository, categoryRepository);
}

更新

我在测试构造函数中添加了上下文:
ApplicationDbContext dbContext;

public UnitTest1()
{
var options = new DbContextOptionsBuilder<ApplicationDbContext>()
.UseInMemoryDatabase(databaseName: "FakeDatabase")
.Options;

dbContext = new ApplicationDbContext(options);
}

和我的测试方法:
    [Fact]
public void ProductsGetAll()
{
IProductRepository productRepository = new ProductRepository(dbContext);
ICategoryRepository categoryRepository = new CategoryRepository(dbContext);
ProductController productController = new ProductController(productRepository, categoryRepository);

var result = productController.List("Pizza");

var contentResult = result as ViewResult;
var final = contentResult != null;
Assert.False(final, "Shouldnt be null");

但现在我有一个错误:
Message: System.NullReferenceException : Object reference not set to an instance of an object.

最佳答案

我创建了一个 interface , 并将所有 DbSets 放入其中。

public class ApplicationDbContext : 
IdentityDbContext<ApplicationUser>, IDbContext
{
...
public DbSet<Category> Categories { get; set; }
...
}

public interface IDbContext
{
DbSet<Category> Categories { get; set; }
...
}

我的 repository依赖于接口(interface)而不是 DbContext。
public class UserRepository : IUserRepository
{
private readonly IDbContext _context;

public UserRepository(IDbContext context)
{
_context = context;
}
}

然后,我模拟 IDbContext 像 this而不是实际的 ApplicationDbContext。
var mockSet = MockHelper.GetMockDbSet(_users);
var mockDbContext = new Mock<IDbContext>();
mockDbContext.Setup(x => x.Users).Returns(mockSet.Object);
varmockDbContext = mockDbContext.Object;

更新

根据问题,您正在尝试模拟存储库。

如果是这样,我建议你创建 接口(interface) 并实现这些接口(interface)。然后将这些接口(interface)注入(inject)构造函数,而不是注入(inject)具体的类。例如。使用 IProductRepository而不是 ProductRepository .

然后你可以简单地模拟 this -
var mockProductRepository = new Mock<IProductRepository>();
mockProductRepository.Setup(x => x.GetAllProductsAsync()).ReturnsAsync(_products);
var productController = new ProductController(mockProductRepository.Object,...);

关于c# - 如何在 xUnit 测试项目中使用 DbContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49449971/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com