2

我正在对数据库运行一些集成测试。我想用种子数据设置数据库,运行我的测试,然后为每个测试删除数据库(所以每个测试都有一个新的石板)。我目前正在使用这些设置/拆卸方法来做到这一点:

private ProjectDbContext db;

[TestInitialize]
public void SetUp()
{
    db = new ProjectDbContext("TestConnection");
    (new SeedData()).Run(db); //Seed Data
}

[TestCleanup]
public void Teardown()
{
    db.Database.Delete();
    db.Dispose();
}

我的问题是每次测试需要半秒多一点,我希望看到更好的性能。有什么想法吗?谁有更好的策略?

4

2 回答 2

0

您可以执行以下操作:

public static void ClearDatabase(DbContext context)
{
    var objectContext = ((IObjectContextAdapter)context).ObjectContext;
    var entities = objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace).BaseEntitySets;
    var method = objectContext.GetType().GetMethods().First(x => x.Name == "CreateObjectSet");
    var objectSets = entities.Select(x => method.MakeGenericMethod(Type.GetType(x.ElementType.FullName))).Select(x => x.Invoke(objectContext, null));
    var tableNames = objectSets.Select(objectSet => (objectSet.GetType().GetProperty("EntitySet").GetValue(objectSet, null) as EntitySet).Name).ToList();

    foreach (var tableName in tableNames)
    {
        context.Database.ExecuteSqlCommand(string.Format("DELETE FROM {0}", tableName));
    }

    context.SaveChanges();
}

如果您没有限制,并且以某种方式为您的测试设置标识列很重要(我不建议这样做),您可以使用 TRUNCATE 而不是 DELETE FROM。

(从这里删除的代码。)

于 2013-03-24T03:24:25.343 回答
0

根据您的代码,我了解到您想删除插入数据库进行测试的数据。我以稍微不同的方式完成了它,但它可能对你有帮助。我们可以使用TransactionScope而不是手动删除数据。代码图片在 TestMethod 中使用 TransactionScope 您还可以访问此处了解该方法的详细信息。

于 2013-06-11T01:13:04.800 回答