У меня есть эта функция в моем интерфейсе, и она создает новую запись PlayersBadge в базе данных. Мне нужно писать модульные тесты, и я застрял.
public void Badge(int pID, int bID, int gID = 0)
{
var list = EliminationDbContext.PlayerBadges.Where(x=>x.Badge.BadgeID.Equals(bID) && x.Player.PlayerID.Equals(pID));
//if player doesn't have Badge create new Badge
if (list.Any() != true)
{
PlayerBadge b = new PlayerBadge { PlayerID = pID, BadgeID = bID, DateEarned = DateTime.Today, GameID = gID };
EliminationDbContext.PlayerBadges.Add(b);
EliminationDbContext.SaveChanges();
}
}
Я хочу издеваться над базой данных
инкапсулируйте базу данных за абстракцией, и абстракцию можно смоделировать и явно внедрить в зависимый класс и модуль, протестированный изолированно.
Не знаю, как бы я это сделал. Вы можете привести пример или ссылку на один?





У вас есть несколько вариантов. Один из них - возложить ответственность за связь с базой данных на классы репозитория и внедрить эти реализации в ваш бизнес-класс. При написании модульных тестов вы можете имитировать репозитории и проверять их.
Другой вариант - напрямую издеваться над DataContext, как показано ниже:
private Mock<DataContext> _mockedContext;
private Mock<DbSet<MyEntity>> _mockedMyEntitiyDbSet;
И в вашем тестовом примере:
[Test]
public void CargoTicket_WithValidRequest_Verify_SaveChanges()
{
//assuming DbContext injected to your _sut object in setup
MockDbSet(myEntities);
_sutObject.Badge(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()); // SaveChanges calling in here
_mockedContext.Verify(s => s.SaveChanges(), Times.Once);
}
Вы можете издеваться над DbSet, как показано ниже:
private void MockDbSet(List<MyEntity> myEntities)
{
_mockedMyEntitiyDbSet= new Mock<DbSet<MyEntity>>().SetupData(myEntities);
_mockedContext.Setup(s => s.MyEntities).Returns(_mockedMyEntitiyDbSet.Object);
}
Вы хотите имитировать базу данных или хотите проверить результат реальной вставки?