2016-03-14 3 views
0

Использование Microsoft.Data.Sqlite, он будет пытаться найти файл базы данных в пределах Wwwroot каталога по умолчанию проекта ASP.NET 5 (Пустой шаблон).Как XUnit Протестируйте ASP.NET 5 с Sqlite

Как правильно xUnit Проверить этот проект? Если я ссылаюсь на этот проект ASP.NET на мой проект тестирования xUnit, он, безусловно, будет использовать каталог xUnit Test Project в качестве базы.

Update 1

Я хочу, чтобы выполнить интеграционное тестирование с использованием XUnit. Спасибо за кого-то, кто разъяснил мне все это.

+0

Вы хотите написать тесты на единицу или интеграцию? Или, может быть, даже системный тест? – Tseng

+0

На данный момент я просто хочу выполнить единичное тестирование. – eSPiYa

+0

Тогда ответ прост: спроектируйте свои классы таким образом, чтобы вы могли передать насмешливый интерфейс классу, который хотите протестировать. Доступ к базам данных или файлам в модульных тестах является абсолютным бездействием. Единичный тест должен тестировать только единицу кода определенного класса **, а не ** его зависимости – Tseng

ответ

1

Идея модульных тестов состоит в том, чтобы тестировать определенную функциональность класса без его зависимостей (например, базы данных, файловой системы или сети).

Для этого вам необходимо спроектировать свои классы с помощью функции инверсии управления и абстрагировать необходимые типы на интерфейсы.

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

public interface IOrdersRepository 
{ 
    IEnumerable<Order> GetOrdersForCustomer(Guid customerId); 
} 

public class OrdersService : IOrdersService 
{ 
    private readonly IOrdersRepository ordersRepository; 

    // pass the orders repository that abstracts the database access 
    // as a dependency, so your OrdersService can be tested in isolation 
    public OrdersService(IOrdersRepository ordersRepository) 
    { 
     this.ordersRepository = ordersRepository 
    } 

    public int GetOrdersCount(Customer customer) 
    { 
     return ordersRepository.GetOrdersForCustomer(customer.Id).Count(); 
    } 

    public decimal GetAllOrdersTotalSum(Customer customer) 
    { 
     return ordersRepository.GetOrdersForCustomer(customer.Id).Sum(order => order.TotalSum); 
    } 
} 

Затем в тестовом модуле вы могли бы сделать что-то вроде

[Fact] 
public void CalculateOrderTotalSumTest() 
{ 
    // customer id we want to check 
    Guid customerId = new Guid("64f52c5c-44b4-4adc-9760-5a03d6f98354"); 

    // Our test data 
    List<Order> orders = new List<Order>() 
    { 
     new Order() { Customer = new Guid("64f52c5c-44b4-4adc-9760-5a03d6f98354"), TotalSum = 100.0m), 
     new Order() { Customer = new Guid("64f52c5c-44b4-4adc-9760-5a03d6f98354"), TotalSum = 50.0m) 
    } 

    // Create a mock of the IOrdersRepository 
    var ordersRepositoryMock = new Mock<IOrdersRepository>(); 
    // Next you need to set up the mock to return a certain value 
    ordersRepositoryMock 
     .Setup(m => m.ordersRepositoryMock(It.Is<Guid>(cId => cId == customerId)) 
     .Returns(orders); 

    decimal totalSum = ordersRepositoryMock.Object.GetAllOrdersTotalSum(customerId); 
    Assert.AreEqual(150.0m, totalSum, "Total sum doesn't match expected result of 150.0m"); 
    ordersRepositoryMock.VerifyAll(); 
} 

Таким образом, вы можете проверить свои классы в изоляции без необходимости базы данных. Если вам нужна база данных, файл в файловой системе или сетевое соединение в модульном тесте, то вы плохо работали над созданием своих типов.

+1

Итак, модульное тестирование предназначено только для тестирования логики, а не для полной функциональности определенных методов? Поэтому я не должен использовать слово или технический термин «Unit Testing» при проверке, не сломал ли я что-то во время разработки моего приложения? Если это так, я также не должен использовать инструменты Unit Testing? Тогда какое автоматическое тестирование я должен использовать, чтобы убедиться, что все функции работают правильно? – eSPiYa

+0

Да, логика тестирования или поведение (это метод xyz интерфейса abc, вызываемый во время теста, может выполняться также с помощью mocks). Если вы хотите протестировать несколько компонентов, взаимодействующих друг с другом, это называется интеграционным тестом. системный тест проверяет все это – Tseng

+0

Я просто посмотрел на него, и xUnit способен интегрировать тестирование. – eSPiYa

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