如何伪造 DbContextOptions

问题描述 投票:0回答:1

我正在为使用 EntityFramework Core 的

ConsumerService
编写单元测试。下面你可以看到我的
AppDBContext
类,以及它的one且唯一构造函数。为了伪造它,我需要将 DbContext 传递给它,所以,我也试图伪造那个。我在伪造 DbContext 对象时遇到问题。

这是我的

AppDBContext 
课程:

   public class AppDbContext : DbContext
    {
        public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }

**消费者**类然后像这样连接它:

        private readonly AppDbContext _db;

        public ConsumerService(AppDbContext db)
        {
            _db = db;
        }

我正在尝试为 consumer 类编写单元测试。

我试过这个:

        private readonly DbContextOptions<AppDbContext> _options;
        private readonly AppDbContext _db;
        private readonly ConsumerService _consumerService ;

        public ConsumerServiceTests()
        {
            //Dependencies
            _options = A.Fake<DbContextOptions<AppDbContext>>();
            _db = A.Fake<AppDbContext>(x => x.WithArgumentsForConstructor(() => new AppDbContext(_options)));

            //SUT
            _consumerService = new ConsumerService(_db);
        }

我收到这个错误:

留言: FakeItEasy.Core.FakeCreationException : 无法创建 API.Data.AppDbContext 类型的伪造: 没有构造函数与传递给构造函数的参数相匹配。 在此调用期间捕获了 System.InvalidOperationException 类型的异常。它的信息是: 传递给 AppDbContextProxy 构造函数的 DbContextOptions 必须是 DbContextOptions。注册多个 DbContext 类型时,请确保每个上下文类型的构造函数都有一个 DbContextOptions 参数,而不是一个非通用的 DbContextOptions 参数。 在 Microsoft.EntityFrameworkCore.DbContext..ctor(DbContextOptions 选项) 在 API.Data.AppDbContext..ctor(DbContextOptions

1 options) in C:\Users\...\API\Data\AppDbContext.cs:line 8 at Castle.Proxies.AppDbContextProxy..ctor(IInterceptor[], DbContextOptions
1 选项) 在 System.RuntimeMethodHandle.InvokeMethod(对象目标、Void** 参数、签名 sig、布尔值 isConstructor) 在 System.Reflection.ConstructorInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)

注意

  1. 我用 FakeItEasy.
  2. 不,我 不想 想使用 InMemoryDatabase。我需要伪造 DbContext。
c# asp.net-core .net-core xunit fakeiteasy
1个回答
0
投票

我通常使用

InMemoryDatabase
来测试我的服务。顺便说一句,你应该实例化一个
DbContextOptionsBuilder

 var options = new DbContextOptionsBuilder<Context>().Options;

它给你你想要的。

© www.soinside.com 2019 - 2024. All rights reserved.