我使用Resharper 8.2,NUnit 2.6.4运行集成测试的行为不一致。 取决于我选择了多少次测试,有时候全部通过,有时只是第一次和持续。 相反,如果我单独运行每个测试,他们都会通过。
在这个原型中,我使用了一个基础测试类,它使用现有的存储过程擦除数据库(避免此步骤结果不会改变),然后初始化数据。
用于为基于构建器和实体的数据库设定种子的类。
public class DefaultTestData<TB, TE> : ITestData where TB:BaseBuilder<TB, TE>
{
public void Seed(DbContext context)
{
context.Set(typeof (TE)).Add(((TB) Activator.CreateInstance(typeof (TB))).Build());
context.Set(typeof (TE)).Add(((TB) Activator.CreateInstance(typeof (TB))).Build());
context.SaveChanges();
}
}
基础测试类,由所有测试类继承。
[TestFixture]
public abstract class BaseTest
{
protected FmsDbContext Context = null;
public abstract ITestData InitializeData();
[Test]
public abstract void Mapping();
[Test]
public abstract void Delete();
[SetUp]
public virtual void SetupInitialData()
{
var data = InitializeData();
Context = new FmsDbContext();
// Context.Database.Initialize(true); -- Using initialize One or Zero test runs
if (data != null)
{
Database.SetInitializer(new TestDataInitializer(data));
}
}
[TearDown]
public virtual void Teardown()
{
if (Context != null)
{
Context.Dispose();
}
}
}
custome Database Initializer Class
public class TestDataInitializer : IDatabaseInitializer<FmsDbContext>
{
private readonly ITestData _data;
public TestDataInitializer(ITestData data)
{
_data = data;
}
private void Seed(DbContext context)
{
if(_data != null)
_data.Seed(context);
}
public void InitializeDatabase(FmsDbContext context)
{
context.Database.ExecuteSqlCommand("EXEC [dbo].[uspWipeDatabase]");
Seed(context);
}
}
public interface ITestData
{
void Seed(DbContext context);
}
简单测试
[TestFixture]
public class TagTest : BaseTest
{
public override ITestData InitializeData()
{
return new DefaultTestData<TagBuilder, Tag>();
}
[Test]
public override void Mapping()
{
var tag = Context.Tags.FirstOrDefault();
Assert.NotNull(tag);
}
[Test]
public override void Delete()
{
var initialCount = Context.Tags.Count();
var tag = Context.Tags.FirstOrDefault();
Context.Tags.Remove(tag);
Context.SaveChanges();
Assert.AreEqual(Context.Tags.Count(), initialCount - 1);
}
}
有什么想法吗?
编辑:
@Steve Fenton 测试失败,因为数据库是空的,因此测试读取和删除数据不起作用。
@Gert Arnold 否。
解
我找到了解决方案,(毕竟)非常明显。 您可以在下面看到最终的解决方案。
关键是 Database.SetInitializer ,它配置EF以使用已注册的 IDatabaseInitializers 初始化数据库。
EF6允许您使用 Context.Database.Initialize(true); 强制数据库运行所有初始值设定项。
布尔参数设置为True强制运行初始值设定项,即使它们已经针对当前上下文运行。
[SetUp]
public virtual void SetupInitialData()
{
var data = InitializeData();
Context = new FmsDbContext();
if (data != null)
{
Database.SetInitializer(new TestDataInitializer(data));
}
Context.Database.Initialize(true);
}
更多信息:http://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize%28v=vs.113%29.aspx
答案 0 :(得分:3)
我找到了解决方案,(毕竟)非常明显。您可以在下面看到最终的解决方案。
关键是 Database.SetInitializer ,它配置EF以使用已注册的 IDatabaseInitializers 初始化数据库。
EF6允许您使用 Context.Database.Initialize(true); 强制数据库运行所有初始值设定项。
布尔参数设置为True强制运行初始值设定项,即使它们已经针对当前上下文运行。
[SetUp]
public virtual void SetupInitialData()
{
var data = InitializeData();
Context = new FmsDbContext();
if (data != null)
{
Database.SetInitializer(new TestDataInitializer(data));
}
Context.Database.Initialize(true);
}
更多信息:http://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize%28v=vs.113%29.aspx