【问题标题】: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();

【问题讨论】:

标签: c# asp.net-core nunit entity-framework-core 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 的主要好处之一是能够保证抛出异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
相关资源
最近更新 更多