c# - 使用固定装置测试 Entity Framework

标签 c# asp.net-mvc-3 entity-framework unit-testing tdd

我喜欢的一件事 Rails'Django's测试方法是他们支持在每个测试运行之前使用固定装置来设置数据库。

过去,我使用严格的单元测试结合模拟存储库来测试我的代码,但我希望有一些像上述测试方法一样易于使用的东西来进行集成测试。

我听过一些关于代码优先和 EF 5 的此类支持的讨论,但我不知道它是否会上升到 Rails 和 Django 提供的水平。

肯定有类似的东西。 任何信息将不胜感激!

最佳答案

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

Migration是一个类,它有几个函数来升级/降级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");
    }
}

您还必须设置 DbContext 和 DbMigrationsConfiguration 配置类以允许代码优先方法工作。

出于测试目的,您需要引入 TestDatabaseInitilizer

public class TestDatabaseInitilizer : DropCreateDatabaseAlways<DbContext>
{

}

它将负责为单元测试初始化​​测试数据库。

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

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);
    }
}

如果需要,可以将设置代码移至基类。

关于c# - 使用固定装置测试 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11320421/

相关文章:

c# - 强类型集合隐式和显式强制转换

c# - 如何创建一个总是产生的任务?

javascript - Safari 和 IE 面临 "field must be date"问题

asp.net-mvc - 后台任务/作业/进程,在 asp.net MVC 3 中

entity-framework - 如何在外部管理(添加)ASP.NET Core 3.1 应用程序的用户

c# - EF Core 中 .Configuration.ProxyCreationEnabled 的等价物是什么?

c# - 在 Roslyn 的 .net core 中动态选择引用

c# - “抽象类”与可重用库的 'normal class'

entity-framework - Entity Framework 与 `virtual` 的混淆

c# - 按字母顺序排列列表,但某些元素始终位于顶部