如何对插入数据库并保存的void函数进行单元测试? [英] How do I unit test a void function that inserts into the database and saves?

查看:151
本文介绍了如何对插入数据库并保存的void函数进行单元测试?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的界面中有此功能,它在数据库中创建了一个新的PlayersBadge条目.我必须为其编写单元测试,而我陷入困境.

I have this function in my interface and it creates a new PlayersBadge entry in the db. I have to write unit tests for and I'm stuck.

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();
        }
    }

推荐答案

您有几种选择.其中之一是将db通信职责赋予存储库类,并将这些实现注入到您的业务类中.编写单元测试时,您可以模拟存储库并进行验证.

You have several options. One of them is giving the db communication responsibility to Repository classes and injecting these implementations in your business class. When writing unit tests, you can mock repositories and verify them.

另一个选择是直接模拟DataContext,如下所示:

Another option is to directly mocking DataContext as below :

    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:

You can mock DbSet as below :

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

这篇关于如何对插入数据库并保存的void函数进行单元测试?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆