Правильный способ тестирования сервисов, использующих DBContext? - PullRequest
0 голосов
/ 26 декабря 2018

Я использовал тест, как показано ниже.У меня есть один большой метод для инициализации всего dbcontext (он больше, чем вставленный ниже, он похож, но с большим количеством моделей и доступом к каждому dbsets для MoQ Verify), что-то вроде fake db.Далее я внедряю его в сервис и вызываю метод, который его использует.

Это правильный способ тестирования сервисов (использующих dbcontext) с юнит-тестами?И если это не правильно, каков хороший способ для тестирования сервисов, подобных этой (возможно, только написать тест, который подключается к реальной базе данных)?

Мой тест:

[Test]
public void ExampleServiceTest()
{
    var mock = InitializeMockContext();

    var service = new TagsService(mock.Object);
    var result = service.GetTags(2);
    var expectection = 2;

    Assert.AreEqual(expectection, result.Id);
}

Метод, который создает mockedDBContext:

public Mock<MyDBContext> InitializeMockContext()
{
    var mock = new Mock<MyDBContext>();
    var mockDataTags = new List<Tags> {
        new Tags { Id = 1, Count = 3 },
        new Tags { Id = 2, Count = 2} }.AsQueryable();
    var mockSet = new Mock<DbSet<Tags>>();
    mockSet.As<IQueryable<Tags>>().Setup(m => m.Provider).Returns(mockDataTags.Provider);
    mockSet.As<IQueryable<Tags>>().Setup(m => m.Expression).Returns(mockDataTags.Expression);
    mockSet.As<IQueryable<Tags>>().Setup(m => m.ElementType).Returns(mockDataTags.ElementType);
    mockSet.As<IQueryable<Tags>>().Setup(m => m.GetEnumerator()).Returns(mockDataTags.GetEnumerator());
    mock.Setup(x => x.Tags).Returns(mockSet.Object);
    //I have more than just one model here
    return mock;
    }

MyService:

public class TagsService
{
    private readonly MyDBContext _ctx;
    public TagsService(MyDBContext ctx)
    {
        _ctx = ctx;
    }
    public Tags GetTags(int count)
    {
        using (var db = _ctx)
        {
            return db.Tags.First(x => x.Count == count);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...