2015-09-18 5 views
0

У меня есть приложение, которое использует структуру сущности. Я пишу блок-тест, в котором я хотел бы использовать тестирование, основанное на данных, из файла CSV.Связанный с данным модулем тестирования разрыв связи с сущностью объекта

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

Initialization метод UnitTest.CalculationTest.MyTestInitialize бросил исключение. System.InvalidOperationException: System.InvalidOperationException: Платформа Entity Framework типа поставщик 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' зарегистрирован в конфигурационном файле приложения для поставщика ADO.NET с инвариантным названием «System. Data.SqlClient ' не может быть загружен. Убедитесь, что присвоено имя сборки и что сборка доступна для запуска приложения.

  1. Если я извлекаю данные управляемые аспекты и просто проверить одно значение, то тест работает.
  2. Если я просто использую аспекты, управляемые данными, и удаляю материал Entity Framework, то тест работает.

Таким образом, его единственный, когда я пытаюсь использовать проверку данных с активной структурой сущности одновременно, получаю ошибку. Итак, где я здесь ошибся?

Вот мой метод испытания:

[TestMethod, TestCategory("Calculations") 
, DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV" 
      , "ConvertedMeanProfileDepth.csv", "ConvertedMeanProfileDepth#csv" 
      , Microsoft.VisualStudio.TestTools.UnitTesting.DataAccessMethod.Sequential) 
, DeploymentItem("ConvertedMeanProfileDepth.csv")] 
public void ConvertedMeanProfileDepthTest() 
{ 
    ConvertedMeanProfileDepth target = new ConvertedMeanProfileDepth(); 
    Decimal mpd = decimal.Parse(this.TestContext.DataRow["mpd"].ToString()); 
    Decimal expected = decimal.Parse(this.TestContext.DataRow["converted"].ToString()); 
    Decimal actual; 
    actual = target.Calculate(mpd); 
    Assert.AreEqual(expected, actual); 
} 

ответ

2

Так мне удалось решить это, в конце концов. На будущее, вот решение: после

Роба Ланга, Entity Framework upgrade to 6 configuration and nuget magic, напомнил мне о проблеме здесь:

Если тип не может быть загружен для DLL, на которую ссылается в проекта, как правило, означает, что он не был скопирован в выходной файл bin /. Если вы не используете тип из указанной библиотеки , он не будет скопирован.

И это поднимет уродливую голову в тот момент, когда вы используете элементы развертывания в своих тестах. Если вы используете элемент развертывания в своем тесте, то все необходимые файлы копируются в каталог развертывания. Проблема в том, что если вы используете динамически загруженные элементы, тогда набор тестов не знает, что он должен копировать эти элементы.

С Entity Framework это означает, что ваши провайдеры не будут скопированы в место развертывания, и вы получите сообщение об ошибке в соответствии с моим вопросом.

Чтобы решить эту проблему, просто убедитесь, что поставщик инфраструктуры сущностей также отмечен как элемент развертывания.

Итак, обратите внимание на включение DeploymentItem (@ "EntityFramework.SqlServer.dll") в мои тестовые атрибуты. Все работает отлично отсюда:

[TestMethod, TestCategory("Calculations") 
    , DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV" 
       , "ConvertedMeanProfileDepth.csv", "ConvertedMeanProfileDepth#csv" 
       , Microsoft.VisualStudio.TestTools.UnitTesting.DataAccessMethod.Sequential) 
    , DeploymentItem("ConvertedMeanProfileDepth.csv") 
    , DeploymentItem(@"EntityFramework.SqlServer.dll")] 
    public void ConvertedMeanProfileDepthTest() 
    { 
     ConvertedMeanProfileDepth target = new ConvertedMeanProfileDepth(); 
     Decimal mpd = decimal.Parse(this.TestContext.DataRow["mpd"].ToString()); 
     Decimal expected = decimal.Parse(this.TestContext.DataRow["converted"].ToString()); 
     Decimal actual; 
     actual = target.Calculate(mpd); 
     Assert.AreEqual(expected, actual); 
    }