Я новичок в написании модульного тестирования.
Я пытаюсь написать модульный тест для вставки пользователя в базу данных, но получаю сообщение об ошибке.
Ошибка: System.NotSupportedException: Введите to макет (SqlConnection) должен быть интерфейсом, делегатом или незапечатанным, нестатическим классом.
У меня есть класс UserRepository:
public class UserRepository : IUSerRepository
{
public async Task InsertUserAsync(User user, SqlConnection connection, SqlTransaction transaction)
{
if (!await UserExistAsync(user.Email!, connection, transaction))
{
using (SqlCommand cmd = new SqlCommand("INSERT INTO users (FLO, email) VALUES (@Flo, @Email);SELECT SCOPE_IDENTITY();", connection, transaction))
{
cmd.Parameters.AddWithValue("@Flo", user.Flo);
cmd.Parameters.AddWithValue("@Email", user.Email);
object? res = await cmd.ExecuteScalarAsync();
return Convert.ToInt32(res);
}
}
else
{
using (SqlCommand cmd = new SqlCommand("SELECT user_id FROM users WHERE email = @Email", connection, transaction))
{
cmd.Parameters.AddWithValue("@Email", user.Email);
object? res = await cmd.ExecuteScalarAsync();
return Convert.ToInt32(res);
}
}
}
public async Task UserExistAsync(string userEmail, SqlConnection connection, SqlTransaction transaction)
{
using (SqlCommand cmd = new SqlCommand("SELECT COUNT(1) FROM users WHERE email = @Email", connection, transaction))
{
cmd.Parameters.AddWithValue("@Email", userEmail);
int count = Convert.ToInt32(await cmd.ExecuteScalarAsync());
return count > 0;
}
}
}
Мне нужно протестировать его методы
Я написал следующий класс для тестов, пока только 1 метод, но получил сообщение об ошибке
Тестовый класс:
public class UserRepositoryTests
{
private readonly Mock _mockConnection;
private readonly Mock _mockTransaction;
private readonly UserRepository _userRepository;
public UserRepositoryTests()
{
_mockConnection = new Mock();
_mockTransaction = new Mock();
_userRepository = new UserRepository();
}
[Fact]
public async Task UserRepository_InsertUserAsync_ShouldInsertNewUser_WhenUserDoesNotExist()
{
// Arrange
var mockCommand = new Mock();
mockCommand.Setup(cmd => cmd.ExecuteScalarAsync()).ReturnsAsync(1);
var mockUser = new User { Flo = "Иванов Иван Иванович", Email = "abc@email.com" };
var mockConnection = new Mock();
var mockTransaction = new Mock();
var userRepository = new Mock();
userRepository.Setup(repo => repo.UserExistAsync(It.IsAny(), It.IsAny(), It.IsAny()))
.ReturnsAsync(false); // Пользователь не существует
// Act
int result = await userRepository.Object.InsertUserAsync(mockUser, mockConnection.Object, mockTransaction.Object);
// Assert
Assert.Equal(1, result);
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... e-database
Ошибка при тестировании xUnit при вставке пользователя в базу данных ⇐ C#
Место общения программистов C#
1727348774
Anonymous
Я новичок в написании модульного тестирования.
Я пытаюсь написать модульный тест для вставки пользователя в базу данных, но получаю сообщение об ошибке.
Ошибка: System.NotSupportedException: Введите to макет (SqlConnection) должен быть интерфейсом, делегатом или незапечатанным, нестатическим классом.
У меня есть класс UserRepository:
public class UserRepository : IUSerRepository
{
public async Task InsertUserAsync(User user, SqlConnection connection, SqlTransaction transaction)
{
if (!await UserExistAsync(user.Email!, connection, transaction))
{
using (SqlCommand cmd = new SqlCommand("INSERT INTO users (FLO, email) VALUES (@Flo, @Email);SELECT SCOPE_IDENTITY();", connection, transaction))
{
cmd.Parameters.AddWithValue("@Flo", user.Flo);
cmd.Parameters.AddWithValue("@Email", user.Email);
object? res = await cmd.ExecuteScalarAsync();
return Convert.ToInt32(res);
}
}
else
{
using (SqlCommand cmd = new SqlCommand("SELECT user_id FROM users WHERE email = @Email", connection, transaction))
{
cmd.Parameters.AddWithValue("@Email", user.Email);
object? res = await cmd.ExecuteScalarAsync();
return Convert.ToInt32(res);
}
}
}
public async Task UserExistAsync(string userEmail, SqlConnection connection, SqlTransaction transaction)
{
using (SqlCommand cmd = new SqlCommand("SELECT COUNT(1) FROM users WHERE email = @Email", connection, transaction))
{
cmd.Parameters.AddWithValue("@Email", userEmail);
int count = Convert.ToInt32(await cmd.ExecuteScalarAsync());
return count > 0;
}
}
}
Мне нужно протестировать его методы
Я написал следующий класс для тестов, пока только 1 метод, но получил сообщение об ошибке
Тестовый класс:
public class UserRepositoryTests
{
private readonly Mock _mockConnection;
private readonly Mock _mockTransaction;
private readonly UserRepository _userRepository;
public UserRepositoryTests()
{
_mockConnection = new Mock();
_mockTransaction = new Mock();
_userRepository = new UserRepository();
}
[Fact]
public async Task UserRepository_InsertUserAsync_ShouldInsertNewUser_WhenUserDoesNotExist()
{
// Arrange
var mockCommand = new Mock();
mockCommand.Setup(cmd => cmd.ExecuteScalarAsync()).ReturnsAsync(1);
var mockUser = new User { Flo = "Иванов Иван Иванович", Email = "abc@email.com" };
var mockConnection = new Mock();
var mockTransaction = new Mock();
var userRepository = new Mock();
userRepository.Setup(repo => repo.UserExistAsync(It.IsAny(), It.IsAny(), It.IsAny()))
.ReturnsAsync(false); // Пользователь не существует
// Act
int result = await userRepository.Object.InsertUserAsync(mockUser, mockConnection.Object, mockTransaction.Object);
// Assert
Assert.Equal(1, result);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79026872/error-when-testing-xunit-inserting-a-user-into-the-database[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия