using AutoLot.Dal.Repos.Interfaces;

using AutoLot.Dal.Tests.Base;

using Microsoft.EntityFrameworkCore;

using Xunit;

namespace AutoLot.Dal.Tests.IntegrationTests

{

  [Collection("Integation Tests")]

  public class OrderTests : BaseTest,

    IClassFixture

  {

  }

}

Добавьте в класс MakeTests конструктор, который создает экземпляр MakeRepo и присваивает его закрытой переменной readonly уровня класса. Переопределите метод Dispose и освободите в нем экземпляр MakeRepo:

[Collection("Integration Tests")]

public class MakeTests : BaseTest,

  IClassFixture

{

  private readonly IMakeRepo _repo;

  public MakeTests

  {

    _repo = new MakeRepo(Context);

  }

  public override void Dispose

  {

    _repo.Dispose;

  }

  ...

}

Повторите те же действия для класса OrderTests, но с использованием OrderRepo вместо MakeRepo:

[Collection("Integration Tests")]

public class OrderTests : BaseTest,

  IClassFixture

{

  private readonly IOrderRepo _repo;

  public OrderTests

  {

    _repo = new OrderRepo(Context);

  }

  public override void Dispose

  {

    _repo.Dispose;

  }

  ...

}

<p id="AutBody_Root1020"><strong>Тестовые методы [Fact] и [Theory]</strong></p>

Тестовые методы без параметров называются фактами (и задействуют атрибут [Fact]). Тестовые методы, которые принимают параметры, называются теориями (они используют атрибут [Theory]) и могут выполнять множество итераций с разными значениями, передаваемыми в качестве параметров. Чтобы взглянуть на такие виды тестов, создайте в проекте AutoLot.Dal.Tests новый файл класса по имени SampleTests.cs. Вот как выглядит оператор using:

using Xunit;

namespace AutoLot.Dal.Tests

{

  public class SampleTests

  {

  }

}

Начните с создания теста [Fact]. В тесте [Fact] все значения содержатся внутри тестового метода. Следующий простой пример проверяет, что 3 + 2 = 5:

[Fact]

public void SimpleFactTest

{

  Assert.Equal(5,3+2);

}

Что касается теста [Theory], то значения передаются тестовому методу и могут поступать из атрибута [InlineData], методов или классов. Здесь будет использоваться только атрибут [InlineData]. Создайте показанный ниже тест, которому предоставляются разные слагаемые и ожидаемый результат:

[Theory]

[InlineData(3,2,5)]

[InlineData(1,-1,0)]

public void SimpleTheoryTest(int addend1, int addend2, int expectedResult)

{

  Assert.Equal(expectedResult,addend1+addend2);

}

На заметку! За дополнительными сведениями об инфраструктуре тестирования xUnit обращайтесь в документацию по ссылке https://xunit.net/.

<p id="AutBody_Root1021"><strong>Выполнение тестов</strong></p>

Хотя тесты xUnit можно запускать из командной строки (с применением dotnet test), разработчикам лучше использовать для этого Visual Studio. Выберите в меню Test (Тестирование) пункт Test Explorer (Проводник тестов), чтобы получить возможность прогонять и отлаживать все или выбранные тесты.

<p id="AutBody_Root1022"><strong>Запрашивание базы данных</strong></p>

Вспомните, что создание экземпляров сущностей из базы данных обычно предусматривает выполнение оператора LINQ в отношении свойств DbSet. Поставщик баз данных и механизм трансляции LINQ преобразуют операторы LINQ в запросы SQL, с помощью которых из базы данных читаются соответствующие данные. Данные можно также загружать посредством метода FromSqlRaw или FromSqlInterpolated с применением низкоуровневых запросов SQL. Сущности, загружаемые в коллекции DbSet, по умолчанию добавляются в ChangeTracker, но отслеживание можно отключать. Данные, загружаемые в коллекции DbSet без ключей, никогда не отслеживаются.

Если связанные сущности уже загружены в DbSet, тогда EF Core будет связывать новые экземпляры по навигационным свойствам. Например, если сущности Car загружаются в коллекцию DbSet и затем связанные сущности Order загружаются в коллекцию DbSet того же самого экземпляра ApplicationDbContext, то навигационное свойство Car.Orders будет возвращать связанные сущности без повторного запрашивания базы данных.

Перейти на страницу:

Похожие книги