Книги онлайн и без регистрации » Разная литература » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 291 292 293 294 295 296 297 298 299 ... 407
Перейти на страницу:
class="code">};

public static List<Make> Makes => new()

{

  new() {Id = 1, Name = "VW"},

  new() {Id = 2, Name = "Ford"},

  new() {Id = 3, Name = "Saab"},

  new() {Id = 4, Name = "Yugo"},

  new() {Id = 5, Name = "BMW"},

  new() {Id = 6, Name = "Pinto"},

};

public static List<Car> Inventory => new()

{

  new() {Id = 1, MakeId = 1, Color = "Black", PetName = "Zippy"},

  new() {Id = 2, MakeId = 2, Color = "Rust", PetName = "Rusty"},

  new() {Id = 3, MakeId = 3, Color = "Black", PetName = "Mel"},

  new() {Id = 4, MakeId = 4, Color = "Yellow", PetName = "Clunker"},

  new() {Id = 5, MakeId = 5, Color = "Black", PetName = "Bimmer"},

  new() {Id = 6, MakeId = 5, Color = "Green", PetName = "Hank"},

  new() {Id = 7, MakeId = 5, Color = "Pink", PetName = "Pinky"},

  new() {Id = 8, MakeId = 6, Color = "Black", PetName = "Pete"},

  new() {Id = 9, MakeId = 4, Color = "Brown", PetName = "Brownie"},

  new() {Id = 10, MakeId = 1, Color = "Rust", PetName = "Lemon",

                                              IsDrivable = false},

};

public static List<Order> Orders => new()

{

  new() {Id = 1, CustomerId = 1, CarId = 5},

  new() {Id = 2, CustomerId = 2, CarId = 1},

  new() {Id = 3, CustomerId = 3, CarId = 4},

  new() {Id = 4, CustomerId = 4, CarId = 7},

  new() {Id = 5, CustomerId = 5, CarId = 10},

};

public static List<CreditRisk> CreditRisks => new()

{

  new()

  {

    Id = 1,

    CustomerId = Customers[4].Id,

    PersonalInformation = new()

    {

      FirstName = Customers[4].PersonalInformation.FirstName,

      LastName = Customers[4].PersonalInformation.LastName

    }

  }

};

Загрузка выборочных данных

Внутренний метод SeedData() в классе SampleDatalnitializer добавляет данные из методов класса SampleData к экземпляру ApplicationDbContext и сохраняет данные в базе данных:

internal static void SeedData(ApplicationDbContext context)

{

  try

  {

    ProcessInsert(context, context.Customers!, SampleData.Customers);

    ProcessInsert(context, context.Makes!, SampleData.Makes);

    ProcessInsert(context, context.Cars!, SampleData.Inventory);

    ProcessInsert(context, context.Orders!, SampleData.Orders);

    ProcessInsert(context, context.CreditRisks!, SampleData.CreditRisks);

  }

  catch (Exception ex)

  {

    Console.WriteLine(ex);

    // Поместить сюда точку останова, чтобы выяснить,

    // в чем заключается проблема.

    throw;

  }

  static void ProcessInsert<TEntity>(

    ApplicationDbContext context,

    DbSet<TEntity> table,

    List<TEntity> records) where TEntity : BaseEntity

  {

     if (table.Any())

     {

       return;

     }

    IExecutionStrategy strategy = context.Database.CreateExecutionStrategy();

    strategy.Execute(() =>

    {

      using var transaction = context.Database.BeginTransaction();

      try

      {

        var metaData = context.Model.FindEntityType(typeof(TEntity).FullName);

        context.Database.ExecuteSqlRaw(

            $"SET IDENTITY_INSERT {metaData.GetSchema()}.

            {metaData.GetTableName()} ON");

        table.AddRange(records);

        context.SaveChanges();

        context.Database.ExecuteSqlRaw(

            $"SET IDENTITY_INSERT {metaData.GetSchema()}.

            {metaData.GetTableName()} OFF");

        transaction.Commit();

      }

      catch (Exception)

      {

        transaction.Rollback();

      }

      });

  }

}

Для обработки данных в методе SeedData() используется локальная функция. Сначала она проверяет, содержит ли таблица какие-то записи, и если нет, то переходит к обработке выборочных данных. Из фасадного экземпляра базы данных создается экземпляр реализации IExecutionStrategy, применяемый для создания явной транзакции, которая необходима для включения и отключения вставки идентичности. Записи добавляются; если все прошло успешно, тогда транзакция фиксируется, а в противном случае подвергается откату.

Приведенные далее два открытых метода используются для сброса базы данных. Метод InitializeData() удаляет и воссоздает базу данных перед ее заполнением начальными данными, а метод ClearDatabase() просто удаляет все записи, сбрасывает идентичность и заполняет базу начальными данными:

public static void InitializeData(ApplicationDbContext context)

{

  DropAndCreateDatabase(context);

  SeedData(context);

}

public static void ClearAndReseedDatabase(ApplicationDbContext context)

{

  ClearData(context);

  SeedData(context);

}

Настройка тестов

 Вместо создания клиентского приложения для испытания скомпилированного уровня доступа к данным AutoLot будет применяться автоматизированное интеграционное тестирование. Тесты продемонстрируют обращение к базе данных на предмет создания, чтения, обновления и удаления, что позволит исследовать код без накладных расходов по построению еще одного приложения. Каждый тест, рассматриваемый в этом разделе, будет выполнять запрос (создание, чтение, обновление или удаление) и иметь один и более операторов Assert для проверки, получен ли ожидаемый результат.

Создание проекта

Первым делом необходимо настроить платформу интеграционного тестирования с использованием xUnit — инфраструктуры тестирования, совместимой с .NET Core. Начните с добавления нового  по имени AutoLot.Dal.Tests, который в Visual Studio носит название xUnit Test Project (.NET Core) (Проект тестирования xUnit (.NET Core)).

На заметку! Модульные тесты предназначены для тестирования одной единицы кода. Формально повсюду в главе создаются интеграционные тесты, т.к. производится тестирование кода C# и EF Core на всем пути к базе данных и обратно.

Введите следующую команду в окне командной строки:

dotnet new xunit -lang c# -n AutoLot.Dal.Tests -o .AutoLot.Dal.Tests -f net5.0

dotnet sln .Chapter23_AllProjects.sln add AutoLot.Dal.Tests

Добавьте в проект AutoLot.Dal.Tests перечисленные ниже пакеты NuGet:

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.SqlServer

Microsoft.Extensions.Configuration.Json

Поскольку версия пакета Microsoft.NET.Test.Sdk, поставляемая с шаблоном проектов xUnit, обычно отстает от текущей доступной версии, воспользуйтесь диспетчером пакетов NuGet для обновления всех пакетов NuGet. Затем добавьте ссылки на проекты AutoLot.Models и AutoLot.Dal.

В случае работы с CLI выполните приведенные далее команды(обратите внимание, что команды удаляют и повторно добавляют пакет Microsoft.NET.Test.Sdk, чтобы гарантировать ссылку на самую последнюю версию):

dotnet

1 ... 291 292 293 294 295 296 297 298 299 ... 407
Перейти на страницу:

Комментарии
Минимальная длина комментария - 20 знаков. В коментария нецензурная лексика и оскорбления ЗАПРЕЩЕНЫ! Уважайте себя и других!
Комментариев еще нет. Хотите быть первым?