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

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

Читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен, Эндрю Троелсен . Жанр: Программирование.
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
Название: Язык программирования C#9 и платформа .NET5
Дата добавления: 26 август 2023
Количество просмотров: 564
(18+) Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту для удаления материала.
Читать онлайн

Язык программирования C#9 и платформа .NET5 читать книгу онлайн

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

В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле.
Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных.
Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

Перейти на страницу:
add AutoLot.Dal.Tests package Microsoft.EntityFrameworkCore

dotnet add AutoLot.Dal.Tests package Microsoft.EntityFrameworkCore.SqlServer

dotnet add AutoLot.Dal.Tests package Microsoft.Extensions.Configuration.Json

dotnet remove AutoLot.Dal.Tests package Microsoft.NET.Test.Sdk

dotnet add AutoLot.Dal.Tests package Microsoft.NET.Test.Sdk

dotnet add AutoLot.Dal.Tests reference AutoLot.Dal

dotnet add AutoLot.Dal.Tests reference AutoLot.Models

Конфигурирование проекта

Для извлечения строки подключения во время выполнения будут задействованы конфигурационные возможности .NET Core, предусматривающие работу с файлом JSON. Добавьте в проект файл JSON по имени appsettings.json и поместите в него информацию о своей строке подключения в следующем формате (надлежащим образом скорректировав ее):

{

  "ConnectionStrings": {

    "AutoLot": "server=.,5433;Database=AutoLotFinal;

    User Id=sa;Password=P@ssw0rd;"

  }

}

Модифицируйте файл проекта, чтобы файл appsettings.json копировался в выходной каталог при каждой компиляции проекта, для чего добавьте в файл AutoLot.Dal.Tests.csproj такой элемент ItemGroup:

<ItemGroup>

  <None Update="appsettings.json">

    <CopyToOutputDirectory>Always</CopyToOutputDirectory>

  </None>

</ItemGroup>

Создание класса TestHelpers

Класс TestHelpers будет обрабатывать конфигурацию приложения, а также создавать новый экземпляр ApplicationDbContext. Создайте в корневом каталоге проекта новый файл открытого статического класса по имени TestHelpers.cs. Приведите операторы using к следующему виду:

using System.IO;

using AutoLot.Dal.EfStructures;

using Microsoft.EntityFrameworkCore;

using Microsoft.EntityFrameworkCore.Storage;

using Microsoft.Extensions.Configuration;

namespace AutoLot.Dal.Tests

{

  public static class TestHelpers

  {

  }

}

Определите два открытых статических метода, предназначенные для создания экземпляров реализации IConfiguration и класса ApplicationDbContext. Добавьте в класс показанный ниже код:

public static IConfiguration GetConfiguration() =>

  new ConfigurationBuilder()

    .SetBasePath(Directory.GetCurrentDirectory())

    .AddJsonFile("appsettings.json", true, true)

    .Build();

public static ApplicationDbContext GetContext(IConfiguration configuration)

{

  var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();

  var connectionString = configuration.GetConnectionString("AutoLot");

   optionsBuilder.UseSqlServer(connectionString,

     sqlOptions => sqlOptions.EnableRetryOnFailure());

  return new ApplicationDbContext(optionsBuilder.Options);

}

Как вероятно вы помните, выделенный полужирным вызов EnableRetryOnFailure() выбирает стратегию повтора SQL Server, которая будет автоматически повторять операции, потерпевших неудачу из-за кратковременных ошибок.

Добавьте еще один статический метод, который будет создавать новый экземпляр ApplicationDbContext с применением того же самого подключения и транзакции, что и в переданном исходном контексте. Этот метод демонстрирует способ создания экземпляра ApplicationDbContext из существующего экземпляра с целью совместного использования подключения и транзакции:

public static ApplicationDbContext GetSecondContext(

  ApplicationDbContext oldContext,

  IDbContextTransaction trans)

{

  var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();

  optionsBuilder.UseSqlServer(

    oldContext.Database.GetDbConnection(),

    sqlServerOptions => sqlServerOptions.EnableRetryOnFailure());

  var context = new ApplicationDbContext(optionsBuilder.Options);

  context.Database.UseTransaction(trans.GetDbTransaction());

  return context;

}

Добавление класса BaseTest

Создайте в проекте новый каталог по имени Base и добавьте туда новый файл класса BaseTest.cs. Модифицируйте операторы using следующим образом:

using System;

using System.Data;

using AutoLot.Dal.EfStructures;

using Microsoft.EntityFrameworkCore;

using Microsoft.EntityFrameworkCore.Storage;

using Microsoft.Extensions.Configuration;

Сделайте класс абстрактным и реализующим IDisposable. Добавьте два защищенных свойства readonly для хранения экземпляров реализации IConfiguration икласса ApplicationDbContext и освободите экземпляр ApplicationDbContext в виртуальном методе Dispose():

namespace AutoLot.Dal.Tests.Base

{

  public abstract class BaseTest : IDisposable

  {

    protected readonly IConfiguration Configuration;

    protected readonly ApplicationDbContext Context;

  public virtual void Dispose()

    {

      Context.Dispose();

    }

  }

}

Инфраструктура тестирования xUnit предоставляет механизм для запуска кода до и после прогона каждого теста. Классы тестов (называемые оснастками), которые реализуют интерфейс IDisposable, перед прогоном каждого теста будут выполнять код в конструкторе класса (в конструкторе базового класса и конструкторе производного класса в этом случае), называемый настройкой теста, а после прогона каждого теста — код в методе Dispose() (в производном и в базовом классах), называемый освобождением теста.

Добавьте защищенный конструктор, который создает экземпляр реализации IConfiguration и присваивает его защищенной переменной класса. С применением конфигурации создайте экземпляр ApplicationDbContext, используя класс TestHelpers, и присвойте его защищенной переменной класса:

protected BaseTest()

{

  Configuration = TestHelpers.GetConfiguration();

  Context = TestHelpers.GetContext(Configuration);

}

Добавление вспомогательных методов для выполнения тестов в транзакциях

Последние два метода в классе BaseTest позволяют выполнять тестовые методы в транзакциях. Методы будут принимать в единственном параметре делегат Action, создавать явную транзакцию (или вовлекать существующую транзакцию), выполнять делегат Action и затем проводить откат транзакции. Так делается для того, чтобы любые тесты создания/обновления/удаления оставляли базу данных в состоянии, в котором она пребывала до прогона теста. Поскольку класс ApplicationDbContext сконфигурирован с целью включения повторений при возникновении кратковременных ошибок, весь процесс обязан выполняться в соответствии со стратегией выполнения ApplicationDbContext.

Метод ExecutelnATransaction() выполняется с применением одиночного экземпляра ApplicationDbContext. Метод ExecutelnASharedTransaction() позволяет нескольким экземплярам ApplicationDbContext совместно использовать транзакцию. Вы узнаете больше об упомянутых методах позже в главе, а пока добавьте в свой класс BaseTest следующий код:

protected void ExecuteInATransaction(Action actionToExecute)

{

  var strategy = Context.Database.CreateExecutionStrategy();

  strategy.Execute(() =>

  {

    using var trans = Context.Database.BeginTransaction();

    actionToExecute();

    trans.Rollback();

  });

}

protected void ExecuteInASharedTransaction(Action<IDbContextTransaction>

actionToExecute)

{

  var strategy = Context.Database.CreateExecutionStrategy();

  strategy.Execute(() =>

   {

    using IDbContextTransaction trans =

      Context.Database.BeginTransaction(IsolationLevel.ReadUncommitted);

    actionToExecute(trans);

    trans.Rollback();

  });

}

Добавление класса тестовой оснастки EnsureAutoLotDatabase

Инфраструктура тестирования xUnit предоставляет механизм, который позволяет запускать код до прогона любого теста (называется настройкой оснастки) и после прогона всех тестов (называется освобождением оснастки). Обычно поступать так не рекомендуется, но в рассматриваемом случае желательно удостовериться, что база данных создана и загружена данными до прогона любого теста, а не до прогона каждого теста. Классы тестов, которые реализуют IClassFixture<T> where Т: TestFixtureClass, должны будут выполнять код конструктора типа Т (т.е. TestFixtureClass) до прогона любого теста и код метода Dispose() после завершения всех тестов.

Создайте в каталоге Base новый файл класса

Перейти на страницу:
Комментарии (0)