Я новичок в TDD, и я использую стек XUnit, AutoFixture и Moq. Мне интересно, какая цель moq - когда вы тестируете функцию, которая делает вызов в репозиторий, который попадает в базу данных.Цель использования Moq для разрешения тестовых зависимостей, если запросы IRepository не возвращают значения
Например:
У меня есть простая структура проекта, где мой BLL ссылается мой DAL. В моем обычном приложении IRproository вводится в ProductBLL.cs. Поэтому я вижу, что Moq помогает мне вводить один и тот же репозиторий в мой тест. (Но какой смысл, если функции, которые попали в базу данных не работают?)
Мой вопрос:
Позволяет сказать, что я делаю тесты, чтобы проверить свой бизнес-уровень, и я хочу, чтобы проверить функции, которые вызывают мое репозиторий, который вызывает мою базу данных в моем фактическом коде. Если использование Moq и данные не возвращаются, можно ли тестировать такие функции? В приведенных ниже примерах sut.GetProducts() ничего не возвращает и в моем фактическом коде он попадает в базу данных и что-то возвращает.
Допустим, у меня есть простой тест, который делает это с Moq:
[Fact]
public void TestGetProducts_Manual_Moq()
{
// Arrange
var mockCustomerRepository = new Mock<IProductRepository>();
var sut = new ProductBLL(mockProductRepository.Object);
// Act
var result = sut.GetProducts();
// Assert
Assert.True(result.Count > 0);
}
Вот простой тест с использованием AutoFixture в сочетании с Moq на полную катушку: (я думаю, что в этом примере AutoFixture по крайней мере возвращения 3 ряда фиктивных данных)
[Fact]
public void TestGetProducts_AutoMoq()
{
// Arrange
Fixture fixture = new Fixture();
// Add auto mocking support for Moq
fixture.Customize(new AutoMoqCustomization());
var sut = fixture.Create<ProductBLL>();
// Act
var result = sut.GetProducts();
// Assert
Assert.True(result.Count > 0);
}
Я понимаю, что нет смысла тестировать функцию, которая просто делает простой вызов базы данных. Но, допустим, у меня действительно сложная бизнес-функция, которая имеет несколько вызовов в репозиторий. Как работает тест, если хранилище никогда ничего не возвращает?Поэтому, основываясь на ваших высказываниях, вы не будете тестировать функцию, возвращающую данные. Но это нормально проверить функцию, которая делает вызовы данных внутри нее? –
Поддельные объекты используются не только для имитации реальных объектов (в этом случае они называются заглушками), но и для проверки правильности использования методов (в этом случае они называются mocks). Другими словами, вы должны использовать mock-объект, созданный Moq, чтобы проверить, что вам нужно. –
Как правило, я бы не тестировал функцию в BLL, которая извлекает данные и что-то делает с ними. Я бы тестировал функцию в BLL, которая берет данные в качестве параметра, поэтому я могу использовать AutoFixture для создания фиктивных данных. Имеет ли это смысл? –