2015-10-02 2 views
1

У меня есть боль, чтобы понять, как тестировать блок с помощью EF в конкретическом примере. вещь кажется наполовину объясненной повсюду.C# unit test entity framework

в моем реальном слове пример у меня есть класс с методом.

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(','); 


     } 
} 

Этот код работает в коде и извлекает некоторое регулярное выражение, хранящееся в моей таблице конфигурации db.

, но в единицах измерения я не могу проверить этот метод ini cuz EF, со случайной ошибкой на всех моих разных попытках.

здесь Шанк кода в моем unitTest.cs

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

     CustomClass PROBTP = new CustomClass(); 

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

я называю CustomClass.init() METHODE от public class UnitTest1

и получить ошибку, когда он не может создать экземпляр моего EF.

для лучшего понимания попробуйте использовать мой код в ответ спасибо.

пс: я слышал moking/усилий/хранилище , но я не понимаю, и даже не знаю, что это действительно лучший Methode ...

ошибка в UniTest: UNITY_DB_PRODEntities12 является EF от основного проекта в UniTest имя Differente

<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" /> 

Nom-дю-тест: UT_Domain ПолноеИмя де тест: UnitTestProject1.UnitTest1.UT_Domain Источник де тест: C: \ Users \ PB19150 \ Documents \ £ DOI-ДИТ-BIM \ Developpement \ DEV-C# \ Genkai_Client_32 \ UnitTestProject1 \ Un itTest1.cs: Ligne 48 Sortie дю тест: Échec Durée дю тест: 0:00:00

Сообщение от résultat невыполнима де Creer ипе экземпляра де-ла-Classe UnitTestProject1.UnitTest1. ERREUR: System.InvalidOperationException: La Chaîne де связь 'UNITY_DB_PRODEntities12' Эст introuvable данс ле Fichier де конфигурация де l'применение .. StackTrace де résultat:
à System.Data.Entity.Internal.LazyInternalConnection.get_ConnectionHasModel() меню системы .Data.Entity.Internal.LazyInternalContext.InitializeContext() à System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType (тип EntityType) à System.Data.Entity.Internal.Linq.InternalSet 1.Initialize() à System.Data.Entity.Internal.Linq.InternalSet 1.get_InternalContext() à System.Data.Entity.Infrastructure.DbQuery 1.System.Linq.IQueryable.get_Provider() à System.Linq.Queryable.First[TSource](IQueryable 1 источник, предикат Expression`1) à Genkai_wpf.CustomClass.Init() dans c: \ Users \ PB19150 \ Documents \ £ DOI-DIT-BIM \ Developpement \ DEV-C# \ Genkai_C lient_32 \ Genkai_wpf \ Control \ CustomClass.cs: ligne 26 à UnitTestProject1.UnitTest1..ctor() dans c: \ Users \ PB19150 \ Documents \ £ DOI-DIT-BIM \ Developmentpement \ DEV-C# \ Genkai_Client_32 \ UnitTestProject1 \ UnitTest1 .cs: ​​ligne 27

Я стараюсь, чтобы дать обе линии связи с тем же именем, но получить другую ошибку.

Nom-дю-тест: UT_Domain ПолноеИмя де тест: UnitTestProject1.UnitTest1.UT_Domain тест Источник: C: \ Users \ PB19150 \ Documents \ £ DOI-ДИТ-BIM \ Разработка \ DEV-C# \ Genkai_Client_32 \ UnitTestProject1 \ UnitTest1.cs: линия 48 выходного тестирования: Failure Test Time: 0 00: 00

результат Сообщение
не создать экземпляр класса UnitTestProject1.UnitTest1. Ошибка: System.Data.Entity.Core.MetadataException: Указанная схема является недействительной. Ошибки: Model1.csdl (3,4): ошибка 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.Autorisation. Model1.csdl (10,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.Config. Model1.csdl (17,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.final_full_data. Model1.csdl (58,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.final_McAfee. Model1.csdl (71,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.final_probtp_user. Model1.csdl (83,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.Real_Time_Update. Model1.csdl (89,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.Stat_Transact. Model1.csdl (98,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.Synchronized_crossdomain_AD. Model1.csdl (107,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.Update_Status. Model1.csdl (114,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.DCAI_ET. Model1.csdl (124,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.debug_final. Model1.csdl (134,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.debug_FPAC. Model1.csdl (144,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.debug_McAfee. Model1.csdl (154,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.final_bmc_fpac. Model1.csdl (174,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.Final_DCAI. Model1.csdl (188,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.FPAC_Debug. Model1.csdl (198,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.Genkai_Delete. Model1.csdl (214,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.Temporary_BASEIP. Model1.csdl (289,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.Temporary_DCAI. Model1.csdl (303,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.Temporary_full_data. Model1.csdl (554,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. уже определено имя типа «UNITY_DB_PRODModel.Check_Transact. Model1.csdl (563,4): Error 0019: Каждое имя типа в схеме должно быть уникальным. Имя типа «UNITY_DB_PRODModel.Record уже определен .. результат StackTrace:
к System.Data.Entity.Core.Metadata.Edm.EdmItemCollection.LoadItems (IEnumerable 1 xmlReaders, IEnumerable 1 sourceFilePaths, SchemaDataModelOption dataModelOption, DbProviderManifest providerManifest, ItemCollection ItemCollection, булева throwOnError) меню System.Data.Entity.Core.Metadata.Edm.EdmItemCollection.Init (IEnumerable 1 xmlReaders, IEnumerable 1, булева путей файлов throwOnError) меню System.Data .Entity.Core.Metadata.Edm.MetadataCache.LoadEdmItemCollection (загрузчик MetadataArtifactLoader) à System.Data.Entity.Core.Metadata.Edm.MetadataCache. <> c__DisplayClass5.b__0 (String к) à System.Collections.Concurrent.ConcurrentDictionary 2.GetOrAdd(TKey key, Func 2 valueFactory) à System.Data.Entity.Core.Metadata.Edm.MetadataCache.GetMetadataWorkspace (String cacheKey, MetadataArtifactLoader artifactLoader) à системе. 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, Boolean isConnectionConstructor, ObjectQueryExecutionPlanFactory objectQueryExecutionPlanFactory, переводчик-переводчик, ColumnMapFactory c olumnMapFactory) à System.Data.Entity.Internal.InternalConnection.CreateObjectContextFromConnectionModel() à System.Data.Entity.Internal.LazyInternalConnection.CreateObjectContextFromConnectionModel() à System.Data.Entity.Internal.LazyInternalContext.InitializeContext() меню системы .Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType (тип EntityType) меню System.Data.Entity.Internal.Linq.InternalSet 1.Initialize() à System.Data.Entity.Internal.Linq.InternalSet 1.get_InternalContext() меню System.Data.Entity.Infrastructure.DbQuery 1.System.Linq.IQueryable.get_Provider() à System.Linq.Queryable.First[TSource](IQueryable 1 источник, Expression` 1 предикат) à Genkai_wpf.CustomClass.Init() dans c: \ Users \ PB19150 \ Documents \ £ DOI-DIT-BIM \ Developmentpement \ DEV-C# \ Genkai_Client_32 \ Genkai_wpf \ Control \ CustomClass.cs: ligne 26 à UnitTes tProject1.UnitTest1..ctor() данс C: \ Users \ PB19150 \ Documents \ £ DOI-ДИТ-BIM \ Developpement \ DEV-C# \ Genkai_Client_32 \ UnitTestProject1 \ UnitTest1.cs: Ligne 27

как Conection строка в обоих проектах находятся в app.config. первая ошибка говорит, что не может найти экземпляр UNITY_DB_PRODEntities12, который делает его с момента его первого проекта. в unittest name отличается от UNITY_DB_PRODEntities1 не 12 Вторая ошибка, когда я пытаюсь дать такое же имя, говорит, что вся моя таблица дублируется.

ответ

1

Если тестовый проект модуля отделено проекта (он выглядит), вам нужно добавить Entity Framework из Nuget в единицу тестового проекта, а также копии всех строк соединения секции есть

Надежда это помогает

Если возможно, включите в ваш вопрос «случайную ошибку».

+0

Я уже добавил, но его экземпляр * EF другого проекта, который был отправлен – Zwan

+0

, можешь добавить ошибку здесь? –

+0

, если я даю одноименную строку связи EF на обоих проектах, изменение ошибки и я получаю конфликт так – Zwan

0

хорошо я решил это сам. Моя основная ошибка заключалась в том, чтобы в проекте unittest вручную было разрешено использовать framework.dll.

все, что мне нужно было сделать, это импортировать сущность с nugets и теперь ее работу.