gpt4 book ai didi

NSubstitute 替换 EF 的核心 DbContext - 如何使用它?

转载 作者:行者123 更新时间:2023-12-02 19:33:44 32 4
gpt4 key购买 nike

我正在尝试为使用我的 EF Core DbContext 的类创建单元测试:

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

public DbSet<SomeTable> SomeTables { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
...
}
}

使用上下文的类很简单:

public class MyClass
{
public MyClass(MyContext db)
{
}
}

所以,当我尝试创建

var fakeContext = Substitute.For<MyContext>();

以错误结尾:

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class: MyContext.
Could not find a parameterless constructor.

base(options) 构造函数引发。因此,最终的方法是扩展代码:

var dbContextOptions = Substitute.For<DbContextOptions<MyContext>>();

dbContextOptions.ContextType.Returns(typeof(MyContext));

var dbContextOptionsExtension = Substitute.For<IEnumerable<IDbContextOptionsExtension>>();
dbContextOptions.Extensions.Returns(dbContextOptionsExtension);

var myFakeContext = Substitute.For<MyContext>(dbContextOptions);

但它会产生更多错误。那么,如何解决呢?

最佳答案

您没有详细说明其他错误,因此我无法提供具体答案,但是尝试正确模拟 DbContext 很困难。 IMO 有两种选择。

1) 使用 Microsoft in-memory provider .

2) 如果您想通过 NSubstitute 使用模拟的 DbContext,请使用为您进行模拟的预先存在的库。周围有一些,例如EntityFrameworkCore.Testing.NSubstitute (免责声明 - 我是作者)。

内存中提供程序不是一个完整的实现,它不能执行关系操作,并且有一些它不支持的 LINQ 操作,因此根据您的用例,后者可能是更好的解决方案。

如果您有特定的错误/用例,请将其弹出,我可能会提供更好的答案。

关于NSubstitute 替换 EF 的核心 DbContext - 如何使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61409524/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com