2

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

Я использую NUnit с VS 2010 в проекте MVC 3. У меня есть проект Tests и я пишу свои первые тесты Evar! :-)

Вы не гордитесь, я, наконец, добираюсь до него ?!

Здесь ошибка я получаю

Microsoft.Practices.ServiceLocation.ActivationException: произошла активация ошибка при попытке получить экземпляр базы данных типа, ключ "MyConnection" ----> Microsoft .Practices.Unity.ResolutionFailedException: Разрешение ошибка с ошибкой, тип = «Microsoft.Practices.EnterpriseLibrary.Data.Database», name = «MyConnection». Исключение произошло во время: при разрешении. Исключение: InvalidOperationException - База данных типа не может быть построена. Вы должны настроить контейнер для подачи этого значения.

Я настроил web.config со всем этим, и данные возвращается прекрасно, когда он не работает в тесте, так что я знаю, что это не конфиг, который умирает за се, это просто умирает при использовании NUnit.

Вот моя информация соединение:

<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" /> 
... 
<dataConfiguration defaultDatabase="MyConnection" /> 
<connectionStrings> 
<add name="MyConnection" connectionString="Data Source=MyServerName;Initial Catalog=MyDB;user id=MyUser;password=MyPassword" 
    providerName="System.Data.SqlClient" /> 
</connectionStrings> 

Я установил Daab используя NuGet, а также делать чистую ручную ссылку. В любом случае, загружает данные штраф в нормальных условиях эксплуатации, но в тестировании он умирает на этой линии:

var database = DatabaseFactory.CreateDatabase("MyConnection"); 

В этом методе

public IEnumerable<SchoolSearchResultsDTO> Find(SchoolSearchInputDTO dto) { 
    List<SchoolSearchResultsDTO> fullList; 
    var database = DatabaseFactory.CreateDatabase("MyConnection"); 
    using (var command = database.GetStoredProcCommand("dbo.usp_School_SearchBySchoolName")) { 
     database.AddInParameter(command, "@I_strSchoolName", DbType.String, dto.SearchTerm); 
     database.AddInParameter(command, "@I_intNumberOfRecords", DbType.Int32, dto.MaxSearchResults); 
     using (var reader = database.ExecuteReader(command)) { 
      fullList = new List<SchoolSearchResultsDTO>(); 
      while (reader.Read()) { 
       var fullRecord = new SchoolSearchResultsDTO(); 
       fullRecord.SchoolID = reader.GetInteger("SchoolId"); 
       fullRecord.SchoolName = reader.GetString("SchoolName"); 
       fullRecord.IsDetailedDisplayMode = reader.GetBoolean("IsDetailedDisplayMode"); 
       fullList.Add(fullRecord); 
      } 
      reader.Close(); 
     } 
    } 
    return fullList; 
} 

Все остальные сообщения говорят о неправильной конфигурации и т.д .. Я довольно конечно, я настроен правильно, иначе я бы не получил данные при нормальном использовании. Так что это связано с NUnit и DaaB вместе.

Любые яркие идеи? :-) Спасибо всем!

ответ

4

Согласитесь с @Jesse относительно насмешливых зависимостей. Если вы не изолируете сут, тогда это не единичный тест.(рекомендуемое значение Art of UnitTesting)

Так что, переходя от этого, можно сказать, что вы пишете тесты интеграции.

Не смотря на точную настройку, трудно сказать, в чем проблема. Одна вещь, о которой вы упомянули, была «настроена на ваш web.config».

Но установили ли вы конфигурационный файл в своем тестовом проекте? Конфигурация будет загружена из вашего тестового проекта, а не проекта MVC.

+0

Отличная информация! Благодаря! Я никогда не думал о том, что мой тестовый проект нуждается в какой-либо специальной конфигурации. Думаю, я все еще барахтаюсь здесь в моих попытках. –

+0

Добавление app.config в тестовый проект исправлено :-) Спасибо за информацию. Кстати, у меня есть книга, еще не запустила ее, но только начала мастер-курс TDD (автор книги, Рой Ошероув) на TekPub вчера и следовал за мной, пока я не повесил трубку. Спасибо за ногу! :-) –

+0

Хороший помощник, TDD станет самым большим изменением в том, как вы кодируете. После первых нескольких препятствий, я думаю, вы обнаружите, что это сделает вас намного более продуктивными. –

2

Как правило, рекомендуется избегать попадания базы данных непосредственно в единичный тест. Я бы рекомендовал отложить некоторое время, чтобы прочитать о насмешливости в отношении создания ценных и надежных модульных тестов. С издевательством вы можете добавить в связанный контроллер смещенный уровень сервиса, который будет настроен для возврата ожидаемых данных базы данных.

В рамках вашего теста вы создадите макет этого уровня обслуживания. Для примера с использованием moq (мой насмешливый рамочное предпочтение):

// create your expected data 
var YourExpectedData = new IList<SchoolSearchResultsDTO>(); 

// .... add your expected information 

//create & setup mock 
var _service = new Mock<IYourService>(); 
_service.Setup(service => service.Find(It.IsAny<SchoolSearchInputDTO>())).Returns(YourExpectedData); 

// create your controller 
var controller = new YourCountroller(_service.object()) 

С этого момента на тестовом модуле является довольно прямо вперед. Каждый раз, когда поиск метода вызывается в рамках различного кода, вы проверяете, что издевательствовает и возвращает ваши ожидаемые данные.

+0

Смотрите, вот почему я так люблю! Хорошо, так что этого я не знал. Я просто предположил, что я тестировал поведение, и поведение, которое я ожидал, - это вернуть данные и подтвердить, что я получил то, что я просил. Поэтому я не уверен, как с этим справиться. В некотором роде приложение - не что иное, как пользовательский интерфейс, который позволяет пользователю искать школу и видеть данные об этой школе. Нет бизнес-логики, обновления данных, и, на мой взгляд, больше ничего не нужно проверять, чем «Внес ли поиск пользователя в исходное состояние, что ожидалось?» Я не вижу, насколько издевательски это даст мне настоящую полезную информацию. –

+0

Но, как говорит jflood, эти типы тестов являются более интеграционными тестами, чем модульные тесты. Это правильно? Я трачу время даже на попытки провести тестирование с помощью такого приложения? –

+0

Это точно точка Mocking. Mocking удаляет зависимость базы данных. Необходимо проверить и поддерживать тестовую базу данных, чтобы убедиться, что вход, возвращаемый в тест, действителен. С издевательством ваши «ожидаемые данные» всегда соответствуют вашим требованиям. Таким образом, вы можете гарантировать, что функциональность вашего тестирования не зависит от вашей базы данных. Тем не менее, если вы хотите изучить подход к типу интеграции, который использует вашу базу данных, я бы порекомендовал: http://blog.codeville.net/2009/06/11/integration-testing-your-aspnet-mvc-application/ – Jesse

Смежные вопросы