【发布时间】: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="data source=M35824\MSQL32BIT;initial catalog=UNITY_DB_PROD;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework"" 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