我正在寻找一种快速方法来清理我的表数据,并使用EF进行集成测试。
每个人似乎都围绕其测试方法包装一个事务,并在测试后处理该事务。
这样,数据永远不会写入表格。
像插入的新自动ID这样的东西仍然有效,但我问自己,与.commit()交易相比,这种方法真的可靠。
使用这种方法有什么缺点似乎不是真正的集成测试,因为数据库永远不会被触及......
或者换句话说是否存在错误的情况,如果没有commit()使用事务而不会作为异常弹出?
更新
public abstract class IntegrationTestsBase
{
protected TransactionScope TransactionScope;
public abstract void TestSetup();
protected void InitTestSetupOnTable(string tableName)
{
TransactionScope = new TransactionScope();
using (var context = new TGBContext())
{
var cmdCommand = string.Format("DBCC CHECKIDENT ({0}, RESEED, 1)", tableName);
context.Database.ExecuteSqlCommand(cmdCommand);
context.SaveChanges();
}
}
[TestCleanup]
public void TestCleanup()
{
TransactionScope.Dispose();
}
}
[TestClass]
public class MyTests : IntegrationTestsBase
{
[TestInitialize]
public override void TestSetup()
{
base.InitTestSetupOnTable("MyTableName");
}
}
答案 0 :(得分:2)
因为永远不会触及数据库
当然感动了。事务中发生的所有事情都发生在数据库中。身份值和序列(如果有的话)递增,触发激发,检查参照约束等等。唯一的事情是,它是孤立地发生的,最后一切(除了增加的身份和序列)被还原。
使用这种方法有什么缺点吗?
不是真的。我在自己的代码中广泛使用这种方法,它有很多优点。绿色测试提供了非常高水平的保证。对于"真实"我永远不会感到安全。使用模拟上下文和DbSet
进行单元测试(尽管我使用单元测试进行许多其他操作)。
但是你应该注意一些限制。
TransactionScope
中。因此,也许不是所有应用程序路径都可以通过这种方式轻松测试。