使用fixture测试实体框架

Bre*_*ker 21 c# tdd unit-testing entity-framework asp.net-mvc-3

我喜欢RailsDjango测试方法的一个原因是他们支持在每次测试运行之前使用fixture来设置数据库.

在过去,我使用严格的单元测试和模拟的存储库来测试我的代码,但我希望能够像上述测试方法一样易于使用,以便进行集成测试.

我听过一些关于代码优先和EF 5这种支持的讨论,但我不知道它是否升级到Rails和Django提供的水平.

当然有可比的东西.任何信息,将不胜感激!

Ale*_*sky 13

在EF5中引入了新概念,称为迁移.您可能曾经习惯在Rails或Django应用程序中使用类似的东西.

迁移是一个类,它具有多个升级/降级DB版本的功能.

public partial class VoteTime : DbMigration
{
    public override void Up()
    {
        AddColumn("Votes", "Time", c => c.DateTime(nullable:false, defaultValue:DateTime.UtcNow));
    }

    public override void Down()
    {
        DropColumn("Votes", "Time");
    }
}
Run Code Online (Sandbox Code Playgroud)

您还必须设置DbContext和DbMigrationsConfiguration配置类,以允许代码第一种方法工作.

出于测试目的,您需要介绍, TestDatabaseInitilizer

public class TestDatabaseInitilizer : DropCreateDatabaseAlways<DbContext>
{

}
Run Code Online (Sandbox Code Playgroud)

它将负责初始化测试数据库以进行单元测试.

最后,您应该设计测试代码来设置上下文.

public class SomeRepositoryTests
{
    private DbContext _context;

    [SetUp]
    public void Setup()
    {
        Database.SetInitializer(new TestDatabaseInitilizer());
        _context = new DbContext("TestContext");
        _repository = new SomeRepository(_context);
    }

    [Test]
    public void should_return_some_entities()
    {
        Assert.That(_repository.Get(), Is.Not.Null);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果需要,可以将设置代码移动到基类.


Fer*_*eia 7

我开发了一个带有Entity Framework的应用程序,它有600多个自动集成测试.这是我使用的过程:

  • 实体框架代码首先迁移只是为了设置数据库结构(表,索引等).我不使用迁移来播种数据.

  • SQL脚本,用于将数据库设置为特定的,众所周知的状态.例如,一个用于插入ASP.NET成员资格用户的脚本; 另一个为最相关的表设置样本数据; 和其他更具体的场景.脚本通常会从相应的表中删除记录,并以适当的顺序再次插入它们,以避免关系冲突.这些脚本作为嵌入式资源包含在Visual Studio项目中.

  • 一个辅助类,可以通过名称从资源获取脚本并对数据库执行,包括使用"GO"批处理命令.ConnectionContext.ExecuteNonQuery可以用于此.

  • 在整个测试套件的开头,我执行设置用户,权限和其他非常一般环境配置的脚本.

  • 在每个测试方法之前,我会根据需要执行一个或多个脚本,以便在运行的测试所需的上下文中设置数据库.例如,在读取,插入,更新和删除数据的一系列CRUD测试之前,我运行一个脚本,用适当的表为测试数据播种.

  • 假设数据库是在特定上下文中设置的,我编写测试用例.例如,更新操作的测试将尝试检索具有已知密钥的记录,更新它并再次读取以检查它是否在数据库中更新.

虽然SQL脚本不像Rails夹具那样易于编写和读取,但它们非常快并且可以进行任何需要的操作(例如DELETE,INSERT,UPDATE,执行存储过程).

这项技术在涉及50个数据库表和非常复杂的业务规则和流程的项目中得到了充分证明.它使测试简单而一致.