Интеграционные тесты с кодом Entity Framework 4 Сначала с использованием SQL Server CE 4 или SQLite - PullRequest
6 голосов
/ 15 февраля 2011

Я хотел бы начать с интеграционного тестирования. Я использую приложение ASP.NET MVC 3. И я использую Entity Framework 4 Code First CTP5. Мои интеграционные тесты с базой данных находятся в отдельном проекте, похожем на MyProject.Data.IntegrationTests.

Я планирую использовать SQL Server CE 4 или SQLite. Какие-либо рекомендации / советы / мнения по использованию любого из них для того, что я пытаюсь достичь?

Кто-нибудь знает какие-нибудь приличные статьи, которые я могу прочитать о том, чего я пытаюсь достичь? И помощь / обратная связь будет оценена.

Я использую SQL Server 2008 для своей базы данных. Но при тестировании моих репозиториев я хотел бы проверить их на одной из этих баз данных, упомянутых выше, поэтому мне нужно будет указать строку подключения.

UPDATE

Я работаю с сервисного уровня (вызывается с моего контроллера), а затем сервисный уровень вызывает мой репозиторий. Например, ниже я бы добавил новость:

Класс обслуживания:

public class NewsService : INewsService
{
   private INewsRepository newsRepository;

   public NewsService(INewsRepository newsRepository)
   {
      this.newsRepository = newsRepository;
   }

   public News Insert(News news)
   {
      // Insert news item
      News newNews = newsRepository.Insert(news);

      // Insert audit entry

      // Return the inserted news item's unique identifier
      return newNews;
   }
}

Класс репозитория:

public class NewsRepository : INewsRepository
{
   MyContext context = new MyContext();

   public NewsRepository()
   {
   }

   public News Insert(News news)
   {
      int newsId = context.Database.SqlQuery<int>("News_Insert @Title, @Body, @Active",
         new SqlParameter("Title", news.Title),
         new SqlParameter("Body", news.Body),
         new SqlParameter("Active", news.Active)
      ).FirstOrDefault();

      news.NewsId = newsId;

      // Return the inserted news item
      return news;
   }
}

Я использую Entity Framework 4 Code First CTP5 и NUnit. Есть ли в NUnit что-то похожее на откат в XUnit?

1 Ответ

2 голосов
/ 15 февраля 2011

Если вы используете среду тестирования, такую ​​как XUnit (http://xunit.codeplex.com/),), она имеет функцию [AutoRollback], которая откатит транзакцию, выполненную в тесте, поэтому ваши данные не изменятся!

Что касается настройки тестов, мне нужно узнать больше о том, как вы настраиваете доступ к данным. Вы использовали шаблон репозитория? ( Entity Framework 4 CTP 4 / CTP 5 Универсальный шаблон репозитория и тестируемый модуль ). Если бы я мог видеть некоторые из вашего кода, это помогло бы. Ниже приведен пример интеграционного теста с XUnit:

private readonly IUserRepository _repository;
        public UserRepositoryTests()
        {
            _repository = new UserRepository(base._databaseFactory);
        }

        [Fact, AutoRollback]
        public void Should_be_able_to_add_user()
        {
            var user = new User{Name = "MockName"};
            _repository.Add(user);
            base._unitOfWork.Commit();

            Assert.True(user.Id > 0);
        }

Таким образом, приведенный выше тест добавляет пользователя в мою базу данных, а затем проверяет его свойство Id, чтобы убедиться, что SQL Server автоматически сгенерировал для него Id. Поскольку метод снабжен атрибутом AutoRollback, после завершения метода данные удаляются из моей базы данных!

...