起订量和设置数据库上下文

Posted

技术标签:

【中文标题】起订量和设置数据库上下文【英文标题】:Moq and setting up DB Context 【发布时间】:2019-03-19 11:40:07 【问题描述】:

我有一个实体框架数据库上下文文件。 我正在尝试在 NUnit 中设置 Moq 框架。当前收到下面的 Moq Nunit 测试错误。我将如何设置 DBContext,并将项目添加到产品表?

"没有为此 DbContext 配置数据库提供程序。可以通过覆盖 DbContext.OnConfiguring 方法或在应用程序服务提供程序上使用 AddDbContext 来配置提供程序。如果使用 AddDbContext,则还要确保您的 DbContext 类型接受DbContextOptions 对象在其构造函数中,并将其传递给 DbContext 的基本构造函数。"

电子数据库上下文文件

public partial class ElectronicsContext : DbContext

    public ElectronicsContext()
    
    

    public ElectronicsContext(DbContextOptions<ElectronicsContext> options)
        : base(options)
    
    

    public virtual DbSet<Product> Product  get; set; 
    public virtual DbSet<ProductCategory> ProductCategory  get; set; 

Startup.cs

    var connection = @"Server=localhost;Database=Electronics;Trusted_Connection=True;ConnectRetryCount=0";
    services.AddDbContext<ElectronicsContext>(options => options.UseSqlServer(connection));

最小起订量测试

 [SetUp]
 public void Setup()
 
    var ElectronicsContext = new Mock<ElectronicsContext>();
    var ProductRepository = new Mock<ProductRepository>();

    Product producttest = new Product();
    _dbContext.Product.Add(new Product ProductId = 1, ProductName = "TV", ProductDescription = "TV testing",ImageLocation = "test");
    _dbContext.SaveChanges();

【问题讨论】:

这应该可以帮助你:mirkomaggioni.com/2017/08/30/ef-db-context-mock-with-moq 【参考方案1】:

您不需要在单元测试中模拟上下文。您应该使用 DbContextOptions 类来指定您想要使用内存数据库来运行您的测试。

[TestMethod]
public void TestProducts()

    var options = new DbContextOptionsBuilder<ElectronicsContext>()
        .UseInMemoryDatabase(databaseName: "Products Test")
        .Options;

    using(var context = new ElectronicsContext(options))
    
        context.Products.Add(new Product ProductId = 1, ProductName = "TV", ProductDescription = "TV testing",ImageLocation = "test");
        context.SaveChanges();
    

    using(var context = new ElectronicsContext(options))
    
        // run your test here

    

这会针对数据库的内存表示运行,而不是依赖于物理服务器。您在startup.cs 中提供的连接字符串不用作测试的一部分。

更多信息可以找到here

【讨论】:

您不想这样做,因为内存数据库将持续存在于您的所有测试中。如果你阅读了我给你的链接,有一行写着Each test method specifies a unique database name, meaning each method has its own InMemory database. 最佳实践是使用测试方法名称作为每个测试的数据库名称 快速提问,我应该什么时候使用 Moq 进行数据库测试? 如果您可以使用 InMemoryDatabase 完成所有测试,那么您可能不需要 Moq 进行数据库测试,但这取决于您的架构。 是的,我只是想知道 模拟而不是 InMemory 的主要好处之一是能够保证抛出异常。

以上是关于起订量和设置数据库上下文的主要内容,如果未能解决你的问题,请参考以下文章

无法为 MediatR 设置起订量回调

最小起订量中的设置序列

起订量 IServiceProvider / IServiceScope

起订量中 VerifyAll() 的用途是啥?

带参数的起订量 ReturnsAsync()

如何为起订量中的属性赋值?