我正在为使用 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)
注意
我通常使用
InMemoryDatabase
来测试我的服务。顺便说一句,你应该实例化一个DbContextOptionsBuilder
:
var options = new DbContextOptionsBuilder<Context>().Options;
它给你你想要的。