Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 配置DbContextOptionsBuilder会使我的数据库测试失败_C#_Asp.net Core_Xunit.net - Fatal编程技术网

C# 配置DbContextOptionsBuilder会使我的数据库测试失败

C# 配置DbContextOptionsBuilder会使我的数据库测试失败,c#,asp.net-core,xunit.net,C#,Asp.net Core,Xunit.net,我正在尝试测试我的数据是否保存在数据库中。当我创建ApplicationDbContext时 对象的参数设置为内存中数据库SqliteConnection连接,则我的测试失败。我得到一个NullReferenceException。当我移除ApplicationDbContext对象中的override OnConfigurang方法以连接其他构造函数设置的机密时,我不再获得异常,测试通过 在为连接保留机密设置的同时,最简单的测试方法是什么 以下是我的一些课程: public class App

我正在尝试测试我的数据是否保存在数据库中。当我创建ApplicationDbContext时 对象的参数设置为内存中数据库SqliteConnection连接,则我的测试失败。我得到一个NullReferenceException。当我移除ApplicationDbContext对象中的override OnConfigurang方法以连接其他构造函数设置的机密时,我不再获得异常,测试通过

在为连接保留机密设置的同时,最简单的测试方法是什么

以下是我的一些课程:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        private readonly AppSecrets _DbInfo;

        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IOptions<AppSecrets> 
        DbInfo) : base(options)
        {
            _DbInfo = DbInfo.Value ?? throw new ArgumentException(nameof(DbInfo));
        }

        // Added for unit test
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options): base(options){    }

        protected override void OnConfiguring(DbContextOptionsBuilder options) =>
            options.UseSqlServer($"{_DbInfo.Database};User ID={_DbInfo.User};Password= {_DbInfo.Password};{_DbInfo.Options};");

        public DbSet<UserBudget> Budgets { get; set; }
    }
public类ApplicationDbContext:IdentityDbContext
{
私有只读AppSecrets _DbInfo;
公共应用程序DBContext(DbContextOptions选项,IOOptions
DbInfo):基本(选项)
{
_DbInfo=DbInfo.Value??抛出新的ArgumentException(nameof(DbInfo));
}
//为单元测试添加了
公共应用程序DBContext(DbContextOptions选项):基本(选项){}
配置时受保护的覆盖无效(DbContextOptionsBuilder选项)=>
options.UseSqlServer($“{u DbInfo.Database};用户ID={{u DbInfo.User};密码={{u DbInfo.Password};{{u DbInfo.options};”);
公共数据库集预算{get;set;}
}
在StartUp.cs中

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<AppSecrets>(Configuration.GetSection("MyBudgetDB"));

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        }
 var config = new AppSecrets();
            Configuration.Bind("MyBudgetDB", config);
            services.AddSingleton(config);

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    $"{config.Database};User ID={config.User};Password={config.Password};{config.Options};"));
public void配置服务(IServiceCollection服务)
{
Configure(Configuration.GetSection(“MyBudgetDB”);
services.AddDbContext(选项=>
options.UseSqlServer(Configuration.GetConnectionString(“DefaultConnection”));
}
试验

[事实]
公共异步任务CreateBudget_createScorectly()
{
const string budgetName=“一般预算”;
双倍金额=1000.0;
var connection=newsqliteconnection(“数据源=:内存:”);
connection.Open();
var options=new DbContextOptionsBuilder()
.UseSqlite(连接)
.选择;
//对上下文的一个实例运行测试
使用(var context=newapplicationdbcontext(选项))
{
context.Database.recreated();
var服务=新预算服务(上下文);
var cmd=new CreateBudgetCommand
{
初始金额=金额,
};
var user=新应用程序用户
{
Id=123.ToString()
};
var recipeId=service.CreateBudget(cmd,user);
}
//使用上下文的单独实例验证是否已将正确的数据保存到数据库中
使用(var context=newapplicationdbcontext(选项))
{
Assert.Equal(1000.0,wait context.Budgets.CountAsync());
var budget=await context.Budgets.SingleAsync();
断言.相等(金额,预算.初始金额);
}
}
谢谢,
Leidy

我在测试中尝试使用SqlConnection并手动设置IOptions,但这更复杂,我得到了相同的错误。为此,我选择了最简单、最合适的路线(我不知道这么容易);通过从ApplicationDbContext中删除OnConfiguring()方法并在启动时添加这些设置:

StartUp.cs

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<AppSecrets>(Configuration.GetSection("MyBudgetDB"));

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        }
 var config = new AppSecrets();
            Configuration.Bind("MyBudgetDB", config);
            services.AddSingleton(config);

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    $"{config.Database};User ID={config.User};Password={config.Password};{config.Options};"));
var config=new-AppSecrets();
Bind(“MyBudgetDB”,config);
services.AddSingleton(config);
services.AddDbContext(选项=>
options.UseSqlServer(
$“{config.Database};用户ID={config.User};密码={config.Password};{config.Options};”);
public类ApplicationDbContext:IdentityDbContext
{
公共应用程序DBContext(DbContextOptions选项)
:基本(选项)
{   }
公共数据库集预算{get;set;}
}

现在,我可以使用Sqlite server测试我的数据是否被持久化了(因为对象关系映射特性,我更喜欢它)。

在dbcontext之外设置它们。在
onconfigurang
方法中,您正在向SqlServer注册上下文,而options向Sqlite注册上下文。DbContext不应该依赖于
UseSqlServer
,而是在类之外执行它。谢谢你的回复。我需要把这个搬进去吗?你能告诉我它应该是什么样子吗?我之前曾尝试在初创公司中添加此功能,但它对我无效。哦,我明白你的意思。。我将UseSqlServer用于DbContext,然后将Sqlite服务器用于测试,该冲突触发了错误。如果我将onconfigurang方法移到类之外,那么DbContext将不依赖于SqlServer(但它不会仍然依赖于SqlServer,因为我正在用它覆盖选项,但我认为这不会影响这个单元测试)。我想知道如果我在测试中使用sqlServer,测试是否有效。我将首先介绍如何在DbContext之外设置秘密。谢谢。我忘了说我可以在StartUp.cs中添加此设置,因为我使用的是.NET Core 2.1。我想我知道你可以在.NETCore2.0或更高版本的初创公司中进行秘密设置。