【问题标题】:c# unit test entity frameworkc#单元测试实体框架
【发布时间】:2015-10-05 16:42:54
【问题描述】:

我很难理解如何在具体示例中使用 EF 进行单元测试。 事情似乎到处都解释了一半。

在我的真实例子中,我有一个带方法的类。

namespace Genkai_wpf
{
    public class CustomClass 
    {
        public UNITY_DB_PRODEntities12 Genkai_db = new UNITY_DB_PRODEntities12();
        public static string[] probtpRegex;
        public static string[] audiensRegex;
        public static string OUDestructionProbtp;
        public static string OUDestructionAudiens;


       public void Init()
        {
            OUDestructionProbtp = Genkai_db.Config.First(x => x.Properties == "OUDestructionProbtp").Value;
            OUDestructionAudiens = Genkai_db.Config.First(x => x.Properties == "OUDestructionAudiens").Value;
            probtpRegex = Genkai_db.Config.First(x => x.Properties == "Regex_Probtp").Value.Split(',');
            audiensRegex = Genkai_db.Config.First(x => x.Properties == "Regex_Audiens").Value.Split(',');


        }
}

此代码在代码中查找并检索存储在我的数据库配置表中的一些正则表达式。

但在 unitest 中,我无法测试这个 ini 方法,因为 EF 拒绝在我所有不同的尝试中出现随机错误。

在我的 unitTest.cs 中省略了代码

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        private TestContext testContextInstance;

        CustomClass PROBTP = new CustomClass();

      public UnitTest1()
        {
            PROBTP.Init();
        }
}
}

我从public class UnitTest1 调用CustomClass.init() 方法

并在无法创建我的 EF 实例时出现错误。

为了更好地理解,请尝试使用我的代码作为回应,谢谢。

ps:我听说过 moking/effort/repository 但我不明白,甚至不知道什么是真正最好的方法......

unitest 中的错误:UNITY_DB_PRODEntities12 是来自主项目的 EF 以不同的名字命名

<add name="UNITY_DB_PRODEntities1" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=M35824\MSQL32BIT;initial catalog=UNITY_DB_PROD;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

测试名称:UT_Domain 测试全名:UnitTestProject1.UnitTest1.UT_Domain 测试源:c:\Users\PB19150\Documents\£DOI-DIT-BIM\Developpement\DEV-C#\Genkai_Client_32\UnitTestProject1\UnitTest1.cs:ligne 48 测试出击:Échec 测试时间:0:00:00

消息 de résultat : Impossible de créer une instance de la classe UnitTestProject1.UnitTest1。 Erreur : System.InvalidOperationException: La chaîne de connexion 'UNITY_DB_PRODEntities12' est introuvable dans le fichier de configuration de l'application.. 堆栈跟踪结果:
à System.Data.Entity.Internal.LazyInternalConnection.get_ConnectionHasModel() à System.Data.Entity.Internal.LazyInternalContext.InitializeContext() à System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) à System.Data.Entity.Internal.Linq.InternalSet1.Initialize() à System.Data.Entity.Internal.Linq.InternalSet1.get_InternalContext() à System.Data.Entity.Infrastructure.DbQuery1.System.Linq.IQueryable.get_Provider() à System.Linq.Queryable.First[TSource](IQueryable1 源,表达式`1 谓词) à Genkai_wpf.CustomClass.Init() dans c:\Users\PB19150\Documents\£DOI-DIT-BIM\Developpement\DEV-C#\Genkai_Client_32\Genkai_wpf\Control\CustomClass.cs:ligne 26 à UnitTestProject1.UnitTest1..ctor() dans c:\Users\PB19150\Documents\£DOI-DIT-BIM\Developpement\DEV-C#\Genkai_Client_32\UnitTestProject1\UnitTest1.cs:ligne 27

然后我尝试为两个连接字符串赋予相同的名称,但得到另一个错误。

测试名称:UT_Domain 测试全名:UnitTestProject1.UnitTest1.UT_Domain 测试源:c:\Users\PB19150\Documents\£DOI-DIT-BIM\Developpement\DEV-C#\Genkai_Client_32\UnitTestProject1\UnitTest1.cs:ligne 48 测试出击:Échec 测试时间:0:00:00

结果消息:
Impossible de créer une instance de la classe UnitTestProject1.UnitTest1。错误:System.Data.Entity.Core.MetadataException:Le schéma spécifié n'est pas valide。错误: Model1.csdl(3,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Autorisation' déjà été défini。 Model1.csdl(10,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Config' déjà été défini。 Model1.csdl(17,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.final_full_data' déjà été défini。 Model1.csdl(58,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.final_McAfee' 似曾相识。 Model1.csdl(71,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.final_probtp_user' déjà été défini。 Model1.csdl(83,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Real_Time_Update' déjà été défini。 Model1.csdl(89,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Stat_Transact' déjà été défini。 Model1.csdl(98,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Synchronized_crossdomain_AD' 似曾相识。 Model1.csdl(107,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Update_Status' déjà été défini。 Model1.csdl(114,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.DCAI_ET' déjà été défini。 Model1.csdl(124,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.debug_final' 似曾相识。 Model1.csdl(134,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.debug_FPAC' déjà été défini。 Model1.csdl(144,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.debug_McAfee' déjà été défini。 Model1.csdl(154,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.final_bmc_fpac' déjà été défini。 Model1.csdl(174,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Final_DCAI' déjà été défini。 Model1.csdl(188,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.FPAC_Debug' déjà été défini。 Model1.csdl(198,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Genkai_Delete' déjà été défini。 Model1.csdl(214,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Temporary_BASEIP' déjà été défini。 Model1.csdl(289,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Temporary_DCAI' déjà été défini。 Model1.csdl(303,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Temporary_full_data' déjà été défini。 Model1.csdl(554,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Check_Transact' déjà été défini。 Model1.csdl(563,4) : erreur 0019: Chaque nom de type dans un schéma doit être unique。 Le nom de type 'UNITY_DB_PRODModel.Record' a déjà été défini.. 堆栈跟踪结果:
à System.Data.Entity.Core.Metadata.Edm.EdmItemCollection.LoadItems(IEnumerable1 xmlReaders, IEnumerable1 sourceFilePaths, SchemaDataModelOption dataModelOption, DbProviderManifest providerManifest, ItemCollection itemCollection, Boolean throwOnError) à System.Data.Entity.Core.Metadata.Edm.EdmItemCollection.Init(IEnumerable1 xmlReaders, IEnumerable1 filePaths, Boolean throwOnError) à System.Data.Entity.Core.Metadata.Edm.MetadataCache.LoadEdmItemCollection(MetadataArtifactLoader 加载器) à System.Data.Entity.Core.Metadata.Edm.MetadataCache.c__DisplayClass5.b__0(String k) à System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func2 valueFactory) à System.Data.Entity.Core.Metadata.Edm.MetadataCache.GetMetadataWorkspace(String cacheKey, MetadataArtifactLoader artifactLoader) à System.Data.Entity.Core.Metadata.Edm.MetadataCache.GetMetadataWorkspace(DbConnectionOptions EffectiveConnectionOptions) à System.Data.Entity.Core.EntityClient.EntityConnection.GetMetadataWorkspace() à System.Data.Entity.Core.Objects.ObjectContext.RetrieveMetadataWorkspaceFromConnection() à System.Data.Entity.Core.Objects.ObjectContext..ctor(EntityConnection connection, Boolean isConnectionConstructor, ObjectQueryExecutionPlanFactory objectQueryExecutionPlanFactory, Translator translate, ColumnMapFactory columnMapFactory) à System.Data.Entity.Internal.InternalConnection.CreateObjectContextFromConnectionModel() à System.Data.Entity.Internal.LazyInternalConnection.CreateObjectContextFromConnectionModel() à System.Data.Entity.Internal.LazyInternalContext.InitializeContext() à System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) à System.Data.Entity.Internal.Linq.InternalSet1.Initialize() à System.Data.Entity.Internal.Linq.InternalSet1.get_InternalContext() à System.Data.Entity.Infrastructure.DbQuery1.System.Linq.IQueryable.get_Provider() à System.Linq.Queryable.First[TSource](IQueryable1 源,表达式`1 谓词) à Genkai_wpf.CustomClass.Init() dans c:\Users\PB19150\Documents\£DOI-DIT-BIM\Developpement\DEV-C#\Genkai_Client_32\Genkai_wpf\Control\CustomClass.cs:ligne 26 à UnitTestProject1.UnitTest1..ctor() dans c:\Users\PB19150\Documents\£DOI-DIT-BIM\Developpement\DEV-C#\Genkai_Client_32\UnitTestProject1\UnitTest1.cs:ligne 27

两个项目中的两个连接字符串都在 app.config 中。 第一个错误说它找不到 UNITY_DB_PRODEntities12 的实例,因为它在第一个项目中是有意义的。在 unittest 中名称不同,它的 UNITY_DB_PRODEntities1 不是 12 当我尝试给出相同名称时的第二个错误说我所有的表都是重复的。

【问题讨论】:

    标签: c# entity-framework unit-testing


    【解决方案1】:

    如果你的单元测试项目是分离项目(看起来像),你需要将Entity FrameworkNuget添加到单元测试项目,以及复制所有连接字符串那里的部分

    希望对你有帮助

    如果可能,请在您的问题中包含“随机错误”。

    【讨论】:

    • 我确实添加了,但它是另一个被调用的项目的 *EF 实例
    • 如果我在两个项目上都给出相同名称的 EF 连接字符串,则错误更改并且我会发生冲突
    • @Zwan 您将连接字符串存储在哪里?这是在 app.config/web.config 里面吗?
    • @Zwan:对不起,我不懂法语,所以我无法阅读您编辑的错误消息。你能帮我把它翻译成英文吗?
    • @Zwan:你需要在两个项目中使用相同的名称(UNITY_DB_PRODEntities12
    【解决方案2】:

    我自己解决了这个问题。 我的主要错误是在 unittest 项目中手动拥有实体 framework.dll。

    我所要做的就是使用 nugets 导入实体框架,现在它可以工作了。

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 2013-10-17
      • 1970-01-01
      • 2017-07-03
      • 2023-03-22
      • 1970-01-01
      • 2011-05-28
      • 2014-08-10
      • 2010-09-10
      相关资源
      最近更新 更多