我正在使用Linq to SQL编写多个单元测试。有时我的代码是这样的:
var products = dataContext.Products;
Assert.That(1, dataContext.ExecuteQuery<int>("select count(*) from product").First()); //this works
Assert.That(1, products.Count()); //this works
dataContext.spCalculateMoreProducts();
Assert.That(2, dataContext.ExecuteQuery<int>("select count(*) from product").First()); //this works
Assert.That(2, products.Count()); // this fails, saying that got 1 instead of 2
spCalculateMoreProducts是一个存储过程,可以将更多产品插入到Linq之外的SQL中。这个问题是dataContext.Products永远不会刷新。我的理解是这就是Linq to SQL的工作原理。我认为它一般都很好,但我想以某种方式强制刷新,所以我可以像上面那样编写我的单元测试。我无法创建新的datacontext,因为整个单元测试在单个事务中运行,最后会回滚。有任何想法吗?
由于
答案 0 :(得分:1)
理想情况下,数据上下文应该是一个工作单元。对我来说,测试失败的地方并不是100%清楚,但我不明白为什么你不能在同一个交易中拥有多个数据上下文。
如果您使用的是基于连接的交易,那么请确保将SqlTransaction
提供给所有上下文。但更简单的是使用TransactionScope
;所有数据上下文都将在环境事务中登记。这使得在DAL中集成测试代码变得轻而易举,而无需更改数据。例如:
using(var tran = new TransactionScope()) {
using(var ctx1 = new MyDataContext()) { ... }
SomeDal.SomeMethod(1,2,3);
using(var ctx2 = new MyDataContext()) { ... }
using(var ctx3 = new MyDataContext()) { ... }
}
此处,使用SqlConnection
的任何内容(除非故意使用null-transaction)都应该在您的事务中,因为我们不调用tran.Complete()
而回滚它。