Тестирование асинхронного метода с помощью EF Core и MoqC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Тестирование асинхронного метода с помощью EF Core и Moq

Сообщение Anonymous »

У меня возникли проблемы при тестировании асинхронных методов с использованием Moq с Entity Framework Core, и я не могу этого понять.
Это метод, с которым я борюсь для написания тестов.

Код: Выделить всё

public async Task LoadAdjustmentsAsync(TimeFilter filter) {
var query = _context.Adjustments.AsQueryable();

DateTime today = DateTime.Now;
switch(filter) {
case TimeFilter.OneWeek:
query = query.Where(s => s.Date >= today.AddDays(-7));
break;
case TimeFilter.TwoWeeks:
query = query.Where(s => s.Date >= today.AddDays(-14));
break;
case TimeFilter.OneMonth:
query = query.Where(s => s.Date >= today.AddMonths(-1));
break;
case TimeFilter.AllTime:
// No filter.
default:
break;
}

var adjustments = await query.OrderByDescending(s => s.Date).ToListAsync();

Adjustments.Clear();

foreach (var adjustment in adjustments) {
Adjustments.Add(adjustment);
}
}
Это первый тест, который я попробовал, но он не сработал, поскольку кажется, что макет IQueryable не поддерживает асинхронные операции.

Код: Выделить всё

[TestClass]
public class AdjustmentsViewModelTests {
private Mock _mockContext = null!;
private Mock _mockAdjustments = null!;
private AdjustmentsViewModel _viewModel = null!;

[TestInitialize]
public void Setup() {
_mockAdjustments = new Mock();
_mockContext = new Mock();

var data = new List {
new Adjustment { Date = DateTime.Now.AddDays(-1) },
new Adjustment { Date = DateTime.Now.AddDays(-8) },
new Adjustment { Date = DateTime.Now.AddDays(-15) }
}.AsQueryable();

_mockAdjustments.As().Setup(m => m.Provider).Returns(data.Provider);
_mockAdjustments.As().Setup(m => m.Expression).Returns(data.Expression);
_mockAdjustments.As().Setup(m => m.ElementType).Returns(data.ElementType);
_mockAdjustments.As().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

_mockContext.Setup(c => c.Adjustments).Returns(_mockAdjustments.Object);

_viewModel = new AdjustmentsViewModel(_mockContext.Object);
}

[TestMethod]
public async Task LoadAdjustmentsAsync_OneWeekFilter() {
await _viewModel.LoadAdjustmentsAsync(TimeFilter.OneWeek);

Assert.AreEqual(1, _viewModel.Adjustments.Count);
Assert.IsTrue(_viewModel.Adjustments.All(a => a.Date >= DateTime.Now.AddDays(-7)));
}
}
Я провел небольшое исследование и попробовал протестировать пакет Moq.EntityFrameworkCore, но безуспешно. Это была вторая попытка использования этого пакета.

Код: Выделить всё

[TestClass]
public class AdjustmentsViewModelTests {
private Mock _mockContext = null!;
private AdjustmentsViewModel _viewModel = null!;

[TestInitialize]
public void Setup() {
var adjustments = new List {
new Adjustment { Date = DateTime.Now.AddDays(-1) },
new Adjustment { Date = DateTime.Now.AddDays(-8) },
new Adjustment { Date = DateTime.Now.AddDays(-15) }
};

_mockContext = new Mock();
_mockContext.Setup(c => c.Adjustments).ReturnsDbSet(adjustments);

_viewModel = new AdjustmentsViewModel(_mockContext.Object);
}

[TestMethod]
public async Task LoadAdjustmentsAsync_OneWeekFilter() {
await _viewModel.LoadAdjustmentsAsync(TimeFilter.OneWeek);

Assert.AreEqual(1, _viewModel.Adjustments.Count);
Assert.IsTrue(_viewModel.Adjustments.All(a => a.Date >= DateTime.Now.AddDays(-7)));
}
}
Есть ли у кого-нибудь знания или рекомендации, которыми можно поделиться, или, может быть, точка зрения в правильном направлении?

Подробнее здесь: https://stackoverflow.com/questions/791 ... re-and-moq
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»