我正在为使用EntityFramework Core的ConsumerService
编写一个单元测试。下面您可以看到我的AppDBContext
类及其唯一的构造函数。为了伪造它,我需要将DbContext传递到中,所以,我也在尝试伪造它。我在伪造DbContext对象时遇到问题。
这是我的AppDBContext
类:
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
**消费者**类然后像这样连接:
private readonly AppDbContext _db;
public ConsumerService(AppDbContext db)
{
_db = db;
}
我正试图为使用者类编写一个单元测试。
我试过这个:
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(DbContextOptions1 options) in C:Users...APIDataAppDbContext.cs:line 8 at Castle.Proxies.AppDbContextProxy..ctor(IInterceptor[], DbContextOptions
1选项)在System.RuntimeMethodHandle.InvokeMethod(对象目标、Void**参数、Signature sig、Boolean isConstructor)在System.Reflection.ConstructorInvoker.Invoke(Object obj,IntPtr*args,BindingFlags invokeAttr)
注意
- 我使用FakeIseasy
- 不,我不想使用InMemoryDatabase。我需要伪造DbContext
我通常使用InMemoryDatabase
来测试我的服务。顺便说一下,你应该实例化一个DbContextOptionsBuilder
:
var options = new DbContextOptionsBuilder<Context>().Options;
它给了你想要的。
您可以创建一个抽象类,然后通过继承它在其他类中使用它,例如:
public abstract class BaseDbContext
{
protected AppDbContext _db;
public BaseDbContext()
{
var builder = new DbContextOptionsBuilder<AppDbContext>();
builder.UseSqlite("DataSource:=memory:", _ => {});
_db = new AppDbContext(builder.Options);
_db.Database.OpenConnection();
_db.Database.EnsureCreated();
}
}