我想验证是否在发生异常的情况下回滚了事务。以下方法可能会引发异常。
// method Checkout(user, reduceMoney, addBill)
using (var transaction = _botContext.Database.BeginTransaction())
{
try
{
await FirstDbUpdate(user, reduceMoney);
await SecondDbUpdate(user, addBill); // potential exception
transaction.Commit();
}
catch (Exception ex)
{
// ...
}
}
为了验证回滚,我编写了此测试:
[Test]
public async Task Test_TransactionFail_RevertedUserUpdate()
{
// Arrange user{budget: 10}
var user = await _userRepository.GetByName("John Doe");
var reduceMoney = 10m;
// Act - null causes an exception
await _service.Checkout(user, reduceMoney, null);
// Assert
var userRetrieved = await _userRepository.GetByName("John Doe");
Assert.AreEqual(10, userRetrieved.Budget);
}
断言失败是因为用户的预算为0,也就是说,看起来更改已被保留,但实际上却并非如此(这是正确的行为)。
所以问题是为什么DbContext为什么返回非持久数据,它是从哪里得到的?回滚是否应该删除它们?
答案 0 :(得分:1)
因为您在某个上下文实例中,所以Assert中的查询将从同一实例加载,而不是直接查询数据库。