我正在使用自动生成的DbContext和MSTest框架测试业务逻辑(在sqlserver数据库中)。 DbContext仅映射实体的一部分,主要用于Web API数据库控制器。测试模式为:
protected U2Db Db; //auto-generated DbContext
protected DbContextTransaction CurrentTransaction;
[TestInitialize]
public void BeforeEveryTest(){
Db = new U2Db();
CurrentTransaction =
Db.Database.BeginTransaction(IsolationLevel.ReadCommitted);
}
[TestMethod]
public void Method1() {
var o = new Order() {Tag="Method1"};
Db.Orders.Add(o);
Db.TrySave(); //custom extension. wraps SaveChanges and reports errors if exist
//checks inner db tables, service broker queues etc.
....
}
[TestMethod]
public void Method2() {
var o = new Order() {Tag="Method2"};
Db.Orders.Add(o);
Db.TrySave(); //wraps SaveChanges and reports errors if exist
....
}
[TestCleanup]
public void AfterEveryTest() {
if (Db == null) return;
try
{
if (CurrentTransaction != null)
{
CurrentTransaction.Rollback();
CurrentTransaction.Dispose();
}
}
catch (Exception e) { };
Db.Dispose();
}
如果我手动运行任何测试,它将按预期运行。如果我开始运行一批测试(依次为单线程),则其中一些将失败。我在Server Profiler中看到的是事务按预期工作,但是在失败的测试中,数据库会获取先前运行的测试中使用的记录,这让我感觉DbContext实际上不是“新”实例。我在做什么错了?
答案 0 :(得分:0)
通常,测试应该是无状态的,以避免此类错误。不要为您的DBContext使用字段,而是在每个测试中实例化一个单独的变量,如下所示:
[TestMethod]
public void Method1() {
var db = new U2Db();
var o = new Order() {Tag="Method1"};
db.Orders.Add(o);
db.TrySave(); //custom extension. wraps SaveChanges and reports errors if exist
//checks inner db tables, service broker queues etc.
....
}