首先使用InMemory数据库和EntityFramework核心代码测试视图

时间:2019-01-15 09:36:56

标签: entity-framework-core asp.net-core-webapi xunit in-memory-database

我有一个EF核心代码优先的Web api应用程序。

有一个Products实体和一个UserProductsRating子实体(具有一对多关系)

我还希望获得一个平均评论分数(并能够基于它进行选择/排序),因此创建了一个视图来做到这一点(使用此答案中所述的方法) [https://stackoverflow.com/a/18707413][1]

因此,我的视图的迁移看起来像:

   protected override void Up(MigrationBuilder migrationBuilder)
            {
                string script =
                @"
                CREATE VIEW AverageProductRating AS 
                SELECT u.ProductId, AVG(CAST(u.Rating AS FLOAT)) as AverageRating 
FROM dbo.UserRatings u GROUP BY u.ProductId";

                migrationBuilder.Sql(script);
            }

            protected override void Down(MigrationBuilder migrationBuilder)
            {
                string script = @"DROP VIEW dbo.AverageProductRating";

                migrationBuilder.Sql(script);
            }

然后在顶部有一个AverageRating实体。

一切正常,并允许我创建以下查询:

 var top5Products = _db.Products.Include(x => x.AverageProductRating)
        .Where(x => x.AverageProductRating != null)
        .OrderByDescending(x => x.AverageProductRating.AverageRating)
        .Take(5); 

当我进行单元/集成测试时,会出现问题。我正在将InMemoryDatabase与sureCreated一起使用来设置测试实例/种子数据。

var options = new DbContextOptionsBuilder<ProductsContext>()
                .UseInMemoryDatabase(Guid.NewGuid().ToString())
                .EnableSensitiveDataLogging()
                .Options;
            var context = new ProductsContext(options);

context.Database.EnsureCreated();

当我对此进行测试时,AverageProductRating实体始终具有零行(我不确定是否完全创建了View)

我认为这可能与内存数据库中SQL的限制或迁移的运行方式有关,但我不确定。

欢迎提出任何解决方法的建议

谢谢

0 个答案:

没有答案