c# - 如何对包含数据库事务的代码进行单元测试

标签 c# unit-testing asp.net-mvc-4 tdd moq

如何在下面的代码周围放置单位:

public DbContextTransaction QTTransactionBegin()
    {
        return Database.BeginTransaction();
    }

public int CreateCampaign(CreateCampaignModel createCampaignModel)
    {
        using (var transaction = _qtContext.QTTransactionBegin())
        {
            try
            {
                var campaign = new Campaign();
                campaign.CampaignCode = createCampaignModel.CampaignCode;
                campaign.CampaignDescription = createCampaignModel.CampaignDescription;
                campaign.CampaignDate = createCampaignModel.CampaignDate;
                campaign.CampaignNotes = createCampaignModel.CampaignNotes;
                campaign.OwnerUserID = createCampaignModel.OwnerUserID;
                campaign.AddedOn = DateTime.Now;
                campaign.AddedBy = createCampaignModel.OwnerUserName;
                campaign.UpdatedOn = DateTime.Now;
                campaign.UpdatedBy = createCampaignModel.OwnerUserName;
                campaign.CampaignSegments = GetCampaignSegmentList(createCampaignModel);

                var campaignId = AddOrUpdateCampaign(campaign);
                transaction.Commit();
                return campaignId;
            }
            catch (Exception ex)
            {
                transaction.Rollback();
            }
        }
        return 0;
    }

谁能告诉我如何对上面的代码进行单元测试?

我尝试了如下代码:

Database_database;

    [TestInitialize]
    public void SetUp()
    {
        _qtDALMock = _factory.CreateMock<IQTDAL>();
        _campaignRepository = new CampaignRepository(_qtDALMock.MockObject);
    }
 [TestMethod]
    public void Check_CreateCampaign_Test()
    {
        // arrange 
        const int expectedCampaignId = 1;
        var createCampaign = QueryToolDummies.CreateCampaignModel;

        _database.BeginTransaction();
        _qtDALMock.Expects.One.MethodWith(x => x.QTTransactionBegin())
            .WillReturn(_database.BeginTransaction());
        _qtDALMock.Expects.One.Method(x => x.AddOrUpdateCampaign(null))
            .With(Is.TypeOf<Campaign>())
            .WillReturn(expectedCampaignId);

        // act
        var result = _campaignRepository.CreateCampaign(createCampaign);

        // assert
        Assert.IsNotNull(result);
    }

这个 _database.BeginTransaction() 有问题。错误说不能像这样使用。

请指教。

最佳答案

一个问题?您为什么要尝试将事务启动到单元测试中?

如果您使用 Moq 框架 模拟您的存储库并返回您需要从存储库返回的内容,将会很容易。

事实上,我认为在单元测试中启动 BeginTransaction() 不是一个好的做法。

希望对你有帮助

关于c# - 如何对包含数据库事务的代码进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22404986/

相关文章:

c# - 重构参数和单元测试

javascript - Knockout JS href attr 未在 .NET MVC4 部分页面上绑定(bind)

c# - 绕过 DotNet 核心服务堆栈上的 SSL 证书验证

c# - 在 C# 中使用 lambda 的 Enumerable.Select 的 Java 等价物是什么?

c# - 有什么方法可以将 Unity3d 带到前台?

unit-testing - 如何在每个测试中以不同的方式模拟克隆的导入依赖项

c++ - 我可以为 C++ 创建自动单元测试吗

asp.net - mvc 4 razor 中的 radio 选中/取消选中

asp.net-mvc - 在razor View 中生成绝对url

c# - 为一些(但不是所有)继承类引入 setter