如何将单位放在以下代码周围:
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()有问题。错误说不能像它一样使用。
请告知。
答案 0 :(得分:0)
一个问题?为什么要尝试将事务启动到单元测试中?
如果您使用Moq framework
模拟您的存储库并返回您需要从repo返回的内容,那将很容易。
事实上,我认为在单元测试中启动BeginTransaction()并不是一个好习惯。
我希望这会有所帮助
答案 1 :(得分:0)
您正在尝试对多个单元进行单元测试。
假设上面的代码是您的“数据层”/存储库,那么您正在执行集成测试,因为测试中涉及多个单元。
您可以在测试类中包含数据库的setup / teardown,并使用有效和无效的数据调用SUT(测试中的主题)以验证预期的行为。
答案 2 :(得分:0)
我也遇到过同样的问题,解决这个问题非常棘手。
我尝试为暴露BeginTransaction()
方法的上下文创建包装器类,但是最终您最终需要在测试时模拟DbContextTransaction
返回的BeginTransaction()
,但是DbContextTransaction
没有接口或公共构造函数。
最后,我编写了一个事务管理器类,该类创建和管理自己的事务,并公开用于开始,提交和回滚事务的方法。然后可以伪造该经理类以及返回它的服务,从而允许对使用事务的代码进行全面测试。
我已经写完in this answer了。