Bre*_*ker 21 c# tdd unit-testing entity-framework asp.net-mvc-3
我喜欢Rails和Django测试方法的一个原因是他们支持在每次测试运行之前使用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)
如果需要,可以将设置代码移动到基类.
我开发了一个带有Entity Framework的应用程序,它有600多个自动集成测试.这是我使用的过程:
实体框架代码首先迁移只是为了设置数据库结构(表,索引等).我不使用迁移来播种数据.
SQL脚本,用于将数据库设置为特定的,众所周知的状态.例如,一个用于插入ASP.NET成员资格用户的脚本; 另一个为最相关的表设置样本数据; 和其他更具体的场景.脚本通常会从相应的表中删除记录,并以适当的顺序再次插入它们,以避免关系冲突.这些脚本作为嵌入式资源包含在Visual Studio项目中.
一个辅助类,可以通过名称从资源获取脚本并对数据库执行,包括使用"GO"批处理命令.ConnectionContext.ExecuteNonQuery可以用于此.
在整个测试套件的开头,我执行设置用户,权限和其他非常一般环境配置的脚本.
在每个测试方法之前,我会根据需要执行一个或多个脚本,以便在运行的测试所需的上下文中设置数据库.例如,在读取,插入,更新和删除数据的一系列CRUD测试之前,我运行一个脚本,用适当的表为测试数据播种.
假设数据库是在特定上下文中设置的,我编写测试用例.例如,更新操作的测试将尝试检索具有已知密钥的记录,更新它并再次读取以检查它是否在数据库中更新.
虽然SQL脚本不像Rails夹具那样易于编写和读取,但它们非常快并且可以进行任何需要的操作(例如DELETE,INSERT,UPDATE,执行存储过程).
这项技术在涉及50个数据库表和非常复杂的业务规则和流程的项目中得到了充分证明.它使测试简单而一致.
| 归档时间: |
|
| 查看次数: |
2552 次 |
| 最近记录: |