Я учусь писать модульные тесты в xUnit и Moq, у меня есть проблема. Написал 2 теста в одном, добавляю категорию и скачиваю все, проверяя через Assert или как там они есть. Во втором случае я еще и добавляю категории, и получаю детали добавленной категории, к сожалению не могу отобразить детали скачанной категории, это тест TestCategoryDetails. Что я делаю неправильно?
using Moq;
using relationship.Models;
using Xunit;
using Xunit.Abstractions;
namespace Testy
{
public class UnitTest1
{
private readonly ITestOutputHelper _output;
public UnitTest1(ITestOutputHelper output)
{
_output = output;
}
[Fact]
public void TestCategoryList()
{
var categoryMock = new Mock<ICategoryRepository>();
var contextMock = new Mock<AppDbContext>();
categoryMock.Setup(x => x.AddCategory(new GameCategory { Id= 1, Name = "Tester" }));
var result = categoryMock.Object;
Assert.NotNull(result.GameCategory());
}
[Fact]
public void TestCategoryDetails()
{
var categoryMock = new Mock<ICategoryRepository>();
var contextMock = new Mock<AppDbContext>();
categoryMock.Setup(x => x.AddCategory(new GameCategory { Id = 1, Name = "Tester" }));
var result = categoryMock.Object;
var categoryDetails = result.GetDetails(1);
Assert.NotNull(categoryDetails);
}
}
}
В общем, я хотел протестировать свой репозиторий, проверив, как добавить, отредактировать, удалить, скачать все категории и детали выбранного, к сожалению, я ничего не делаю.





Что вы делаете, так это пытаетесь протестировать макет абстракции репозитория. Но вы хотите проверить свою реализацию.
Что хорошо работает для тестирования с контекстом БД, так это использование поставщика памяти для реального контекста. Подробнее см.: https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/
В итоге это может выглядеть так (второй тест):
...
[Fact]
public void TestCategoryDetails()
{
// arrange
var categoryRepository = new CategoryRepository(GetContextWithInMemoryProvider());
// act
categoryRepository.AddCategory(new GameCategory { Id = 1, Name = "Tester" });
var categoryDetails = categoryRepository.GetDetails(1);
// assert
Assert.NotNull(categoryDetails);
}
private AppDbContext GetContextWithInMemoryProvider()
{
// create and configure context
// see: https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/
}
...
Можно ли с уверенностью сказать, что это больше не будет модульным тестом? Поскольку тест будет вызывать базу данных (даже если она находится в памяти)? Это интеграционный тест ИМО.