Unit testing 如何对插入数据库并保存的void函数进行单元测试?

Unit testing 如何对插入数据库并保存的void函数进行单元测试?,unit-testing,testing,interface,moq,void,Unit Testing,Testing,Interface,Moq,Void,我的界面中有这个函数,它在db中创建一个新的PlayerBadge条目。我必须为写单元测试,我被卡住了 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));

我的界面中有这个函数,它在db中创建一个新的PlayerBadge条目。我必须为写单元测试,我被卡住了

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;
    private void MockDbSet(List<MyEntity> myEntities)
    {
        _mockedMyEntitiyDbSet= new Mock<DbSet<MyEntity>>().SetupData(myEntities);
        _mockedContext.Setup(s => s.MyEntities).Returns(_mockedMyEntitiyDbSet.Object);
    }
private Mock\u mockedContext;
私人模拟(u mockedmyentiydbset);;
在您的测试用例中:

    [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);
    }
[测试]
公共作废货票\u带有效请求\u验证\u保存更改()
{
//假设在安装程序中将DbContext注入到_sut对象中
MockDbSet(myenties);
_sutObject.Badge(It.IsAny(),It.IsAny(),It.IsAny());//此处调用SaveChanges
_验证(s=>s.SaveChanges(),Times.Once);
}
您可以按如下方式模拟DbSet:

    private Mock<DataContext> _mockedContext;
    private Mock<DbSet<MyEntity>> _mockedMyEntitiyDbSet;
    private void MockDbSet(List<MyEntity> myEntities)
    {
        _mockedMyEntitiyDbSet= new Mock<DbSet<MyEntity>>().SetupData(myEntities);
        _mockedContext.Setup(s => s.MyEntities).Returns(_mockedMyEntitiyDbSet.Object);
    }
private void MockDbSet(列出myEntities)
{
_mockedMyEntitiyDbSet=new Mock().SetupData(myEntities);
_Setup(s=>s.MyEntities).Returns(_mockedMyEntitiyDbSet.Object);
}

您是想模拟数据库还是想检查实际插入的结果?我想模拟数据库将数据库封装在抽象后面,抽象可以被模拟并显式注入依赖类中,并单独进行单元测试。我不确定该怎么做。你能给出一个例子或一个链接吗?