Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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# NUnit测试期间无法在VS 2015中创建LocalDB_C#_Visual Studio 2015_Entity Framework 6_Nunit_Localdb - Fatal编程技术网

C# NUnit测试期间无法在VS 2015中创建LocalDB

C# NUnit测试期间无法在VS 2015中创建LocalDB,c#,visual-studio-2015,entity-framework-6,nunit,localdb,C#,Visual Studio 2015,Entity Framework 6,Nunit,Localdb,我肯定有人已经试过了,我不可能是第一个!?!我使用Visual Studio 2015、LocalDB(2014)、EntityFramework 6.1.3、NUnit 3.5和ReSharper 2016.2建立了一个测试项目。基本上,我正在尝试使用NUnit对连接到LocalDB数据库的EntityFramework项目运行集成测试。我的机器上安装了ReSharper,我正在使用ReSharper的单元测试工具运行NUnit单元测试(我使用NUnit 3控制台得到完全相同的结果)。EF首先

我肯定有人已经试过了,我不可能是第一个!?!我使用Visual Studio 2015、LocalDB(2014)、EntityFramework 6.1.3、NUnit 3.5和ReSharper 2016.2建立了一个测试项目。基本上,我正在尝试使用NUnit对连接到LocalDB数据库的EntityFramework项目运行集成测试。我的机器上安装了ReSharper,我正在使用ReSharper的单元测试工具运行NUnit单元测试(我使用NUnit 3控制台得到完全相同的结果)。EF首先设置为代码,应用程序的上下文设置为“DropCreateDatabaseAlways”,因此在每次测试期间应删除并重新创建.mdf文件

每次运行单元测试时,我都会遇到同样的神秘错误:“System.OverflowException:算术运算导致溢出。”我知道这是.NET和NUnit之间的冲突,因为我设置了一个具有完全相同设置(无单元测试)的控制台应用程序,它工作得非常完美!控制台应用程序可以创建一个.mdf文件,我可以使用VS的LocalDB数据库连接器连接到该文件并查看其表

配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="HyperQueryEF" connectionString="Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\HyperQueryEF.mdf;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>
using System;

namespace HyperQueryEF.Model
{
    public class Dealership
    {
        public int ID { get; set; }
        public DateTime DateCreated { get; set; }
        public string Name { get; set; }
    }
}
using System.Data.Entity;

namespace HyperQueryEF.Model
{
    public class HyperQueryEFContext : DbContext
    {
        public HyperQueryEFContext() : base("HyperQueryEF")
        {
        }

        public void Initialize()
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<HyperQueryEFContext>());
            //Force database to initialize (Create/Migrate tables).
            Database.Initialize(true);
        }

        public virtual DbSet<Dealership> Dealerships { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //modelBuilder.Configurations.AddFromAssembly(this.GetType().Assembly);
            modelBuilder.Entity<Dealership>().ToTable("Dealership");
            modelBuilder.Entity<Dealership>()
                .HasKey(x => x.ID)
                .Property(x => x.ID);
            modelBuilder.Entity<Dealership>()
                .Property(x => x.Name);

            base.OnModelCreating(modelBuilder);
        }
    }
}
using System;
using System.IO;
using System.Reflection;
using HyperQueryEF.Model;
using NUnit.Framework;

namespace HyperQueryEF.Tests.IntegrationTests.TransactionManagerTests
{
    [TestFixture]
    public class When_the_app_initializes
    {
        private DirectoryInfo _appDataDirectory;
        private HyperQueryEFContext _context;

        [SetUp]
        public void SetUp()
        {
            _appDataDirectory = new DirectoryInfo(Assembly.GetExecutingAssembly().Location).Parent;
            AppDomain.CurrentDomain.SetData("DataDirectory", Directory.GetCurrentDirectory());
        }

        [Test]
        public void The_database_exists_as_configured()
        {
            _context = new HyperQueryEFContext();
            _context.Initialize();
        }
    }
}
DbContext:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="HyperQueryEF" connectionString="Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\HyperQueryEF.mdf;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>
using System;

namespace HyperQueryEF.Model
{
    public class Dealership
    {
        public int ID { get; set; }
        public DateTime DateCreated { get; set; }
        public string Name { get; set; }
    }
}
using System.Data.Entity;

namespace HyperQueryEF.Model
{
    public class HyperQueryEFContext : DbContext
    {
        public HyperQueryEFContext() : base("HyperQueryEF")
        {
        }

        public void Initialize()
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<HyperQueryEFContext>());
            //Force database to initialize (Create/Migrate tables).
            Database.Initialize(true);
        }

        public virtual DbSet<Dealership> Dealerships { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //modelBuilder.Configurations.AddFromAssembly(this.GetType().Assembly);
            modelBuilder.Entity<Dealership>().ToTable("Dealership");
            modelBuilder.Entity<Dealership>()
                .HasKey(x => x.ID)
                .Property(x => x.ID);
            modelBuilder.Entity<Dealership>()
                .Property(x => x.Name);

            base.OnModelCreating(modelBuilder);
        }
    }
}
using System;
using System.IO;
using System.Reflection;
using HyperQueryEF.Model;
using NUnit.Framework;

namespace HyperQueryEF.Tests.IntegrationTests.TransactionManagerTests
{
    [TestFixture]
    public class When_the_app_initializes
    {
        private DirectoryInfo _appDataDirectory;
        private HyperQueryEFContext _context;

        [SetUp]
        public void SetUp()
        {
            _appDataDirectory = new DirectoryInfo(Assembly.GetExecutingAssembly().Location).Parent;
            AppDomain.CurrentDomain.SetData("DataDirectory", Directory.GetCurrentDirectory());
        }

        [Test]
        public void The_database_exists_as_configured()
        {
            _context = new HyperQueryEFContext();
            _context.Initialize();
        }
    }
}
(注意,我将| DataDirectory | AppDomian设置设置为与web应用一致)

规格: 操作系统:Windows10Pro .NET:4.5.2

堆栈跟踪:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="HyperQueryEF" connectionString="Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\HyperQueryEF.mdf;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>
using System;

namespace HyperQueryEF.Model
{
    public class Dealership
    {
        public int ID { get; set; }
        public DateTime DateCreated { get; set; }
        public string Name { get; set; }
    }
}
using System.Data.Entity;

namespace HyperQueryEF.Model
{
    public class HyperQueryEFContext : DbContext
    {
        public HyperQueryEFContext() : base("HyperQueryEF")
        {
        }

        public void Initialize()
        {
            Database.SetInitializer(new DropCreateDatabaseAlways<HyperQueryEFContext>());
            //Force database to initialize (Create/Migrate tables).
            Database.Initialize(true);
        }

        public virtual DbSet<Dealership> Dealerships { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //modelBuilder.Configurations.AddFromAssembly(this.GetType().Assembly);
            modelBuilder.Entity<Dealership>().ToTable("Dealership");
            modelBuilder.Entity<Dealership>()
                .HasKey(x => x.ID)
                .Property(x => x.ID);
            modelBuilder.Entity<Dealership>()
                .Property(x => x.Name);

            base.OnModelCreating(modelBuilder);
        }
    }
}
using System;
using System.IO;
using System.Reflection;
using HyperQueryEF.Model;
using NUnit.Framework;

namespace HyperQueryEF.Tests.IntegrationTests.TransactionManagerTests
{
    [TestFixture]
    public class When_the_app_initializes
    {
        private DirectoryInfo _appDataDirectory;
        private HyperQueryEFContext _context;

        [SetUp]
        public void SetUp()
        {
            _appDataDirectory = new DirectoryInfo(Assembly.GetExecutingAssembly().Location).Parent;
            AppDomain.CurrentDomain.SetData("DataDirectory", Directory.GetCurrentDirectory());
        }

        [Test]
        public void The_database_exists_as_configured()
        {
            _context = new HyperQueryEFContext();
            _context.Initialize();
        }
    }
}
在 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,UInt32 WaitForMultipleObjectStimOut,布尔型 allowCreate,仅布尔值EchkConnection,DbConnectionOptions userOptions、DbConnectionInternal和connection)位于 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject,TaskCompletionSource
1重试,DbConnectionOptions
userOptions、DbConnectionInternal和connection)位于
System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection
owningConnection,TaskCompletionSource
1重试,DbConnectionOptions 用户选项、DbConnectionInternal oldConnection、DbConnectionInternal& 连接)在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection 外部连接,数据库连接工厂连接工厂, TaskCompletionSource
1重试,DbConnectionOptions用户选项)位于
System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource
1 重试)在 System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource
1
重试)在System.Data.SqlClient.SqlConnection.Open()处
System.Data.Entity.Infrastructure.InternalDispatcher
1.Dispatch[TTarget,TinterAcceptionContext](TTarget 目标,操作
2操作,TInterceptionContext拦截context,
动作
3执行,动作3执行)在 System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection 连接,DbInterceptOnContext(InterceptOnContext)位于 System.Data.Entity.SqlServer.SqlProviderServices.c__DisplayClass33.b__32() 在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.c__DisplayClass1.b__0() 在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func1 操作)在 System.Data.Entity.SqlServer.SqlProviderServices.UsingMasterConnection(DbConnection sqlConnection,动作<代码>1动作) System.Data.Entity.SqlServer.SqlProviderServices.CreateDatabaseFromScript(可空1 commandTimeout、DbConnection、sqlConnection、字符串 createDatabaseScript)位于 System.Data.Entity.SqlServer.SqlProviderServices.DbCreateDatabase(DbConnection 连接,Nullable
1命令超时,StoreItemCollection
storeItemCollection)位于
System.Data.Entity.Migrations.Utilities.DatabaseCreator.Create(DbConnection
连接)在
System.Data.Entity.Migrations.Dbmigator.EnsureDatabaseExists(操作
必须在以下位置成功访问数据库:
System.Data.Entity.Migrations.DbMigrator.Update(字符串
目标(迁移)在
System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext
internalContext,Func
3 createMigrator,ObjectContext(对象上下文)
位于System.Data.Entity.Database.Create(DatabaseExistenceEstate 存在(不动产)在 System.Data.Entity.DropCreateDatabaseAlways`1.InitializeDatabase(TContext (上下文)在 System.Data.Entity.Internal.InternalContext.PerforminizationAction(操作 行动)在 System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() 在中的HyperQueryEF.Model.HyperQueryEFContext.Initialize()处 C:\Users\agilliam\Dropbox\HyperQueryEF\Projects\HyperQueryEF.Model\HyperQueryEFContext.cs:line 15在 HyperQueryEF.Tests.IntegrationTests.TransactionManagerTests。当\u应用程序\u初始化时。数据库\u以\u配置的形式存在() 在里面 C:\Users\agilliam\Dropbox\HyperQueryEF\Projects\HyperQueryEF.Tests\IntegrationTests\TransactionManagerTests.cs:line 二十六


更新:实体框架似乎不是为了支持NUnit而构建的。我使用MSTest平台构建并运行了完全相同的测试,它可以正常工作。我确实更喜欢NUnit而不是MSTest,但MSTest似乎可以很好地完成工作