Как написать концептуально правильный модульный тест для метода API с LINQ?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 Как написать концептуально правильный модульный тест для метода API с LINQ?

Сообщение Гость »

Я учусь писать модульные тесты, пожалуйста, не судите. У меня есть метод API ниже, написанный в C# для .NET 8.0, который я хочу проверить. Я использую Xunit, Entity Framework Core 8, SQL Server 2019. В настоящее время я переписываю его, чтобы отделить уровень данных, поэтому мне не придется контекст MOQ DB. < /P>

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

[HttpGet("GetABunch")]
public async Task GetABunch()
{
string[] myAnimals = { "dog", "cat" };

var animals = await _context.TodoItems
.Where(i => myAnimals.Contains(i.Name))
.ToListAsync();

return Ok(animals);
}
< /code>
Мой модульный тест не работает. Я получаю ошибку: < /p>

system.argumentexception: не может создать создание прокси класса: todoapidb.models.todocontext.

не может найти конструктор без параметра. (Параметр 'Constructorarguments') < /p>
< /blockquote>
Но перед тем, как сражаться с этой ошибкой и создавать конструктор контекста без параметров, я считаю, что мой тест концептуально неверен, пожалуйста, помогите исправить.[Fact]
public async Task GetABunch_ReturnsFilteredTodoItems()
{
// Arrange
var mockData = new List
{
new TodoItem { Id = 1, Name = "dog" },
new TodoItem { Id = 2, Name = "cat" },
new TodoItem { Id = 3, Name = "bird" }
}.AsQueryable();

var mockSet = new Mock();
mockSet.As().Setup(m => m.Provider).Returns(mockData.Provider);
mockSet.As().Setup(m => m.Expression).Returns(mockData.Expression);
mockSet.As().Setup(m => m.ElementType).Returns(mockData.ElementType);
mockSet.As().Setup(m => m.GetEnumerator()).Returns(mockData.GetEnumerator());
mockSet.As().Setup(m => m.GetAsyncEnumerator(It.IsAny()))
.Returns(new TestAsyncEnumerator(mockData.GetEnumerator()));

var mockContext = new Mock();
//mockContext.Setup(c => c.TodoItems).Returns(mockSet.Object);
mockContext.Setup(c => c.Set()).Returns(mockSet.Object);

var controller = new TodoItemsController(mockContext.Object);

// Act
var result = await controller.GetABunch();

// Assert
var actionResult = Assert.IsType(result.Result);
var returnedItems = Assert.IsType(actionResult.Value);
Assert.Equal(2, returnedItems.Count);
Assert.Contains(returnedItems, i => i.Name == "dog");
Assert.Contains(returnedItems, i => i.Name == "cat");
}
тестирование кода приложения на github.

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

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

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

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

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

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

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