【问题标题】:Integration tests with Entity Framework 4 Code First using SQL Server CE 4 or SQLite使用 SQL Server CE 4 或 SQLite 与 Entity Framework 4 Code First 进行集成测试
【发布时间】:2021-01-15 17:13:50
【问题描述】:

我想从集成测试开始。我正在使用 ASP.NET MVC 3 应用程序。我正在使用 Entity Framework 4 Code First CTP5。我对数据库的集成测试在一个单独的项目中,例如 MyProject.Data.IntegrationTests。

我计划使用 SQL Server CE 4 或 SQLite。关于使用其中任何一种来实现我想要完成的任何建议/提示/意见?

有没有人知道我可以阅读的关于我正在努力完成的任何体面的文章?帮助/反馈将不胜感激。

我正在为我的数据库使用 SQL Server 2008。但是在测试我的存储库时,我想针对上面提到的这些数据库之一进行测试,所以我需要指定连接字符串。

更新

我从服务层(从我的控制器调用)工作,然后服务层将调用我的存储库。例如,下面是我添加新闻的方式:

服务类:

public class NewsService : INewsService
{
   private INewsRepository newsRepository;

   public NewsService(INewsRepository newsRepository)
   {
      this.newsRepository = newsRepository;
   }

   public News Insert(News news)
   {
      // Insert news item
      News newNews = newsRepository.Insert(news);

      // Insert audit entry

      // Return the inserted news item's unique identifier
      return newNews;
   }
}

存储库类:

public class NewsRepository : INewsRepository
{
   MyContext context = new MyContext();

   public NewsRepository()
   {
   }

   public News Insert(News news)
   {
      int newsId = context.Database.SqlQuery<int>("News_Insert @Title, @Body, @Active",
         new SqlParameter("Title", news.Title),
         new SqlParameter("Body", news.Body),
         new SqlParameter("Active", news.Active)
      ).FirstOrDefault();

      news.NewsId = newsId;

      // Return the inserted news item
      return news;
   }
}

我正在使用 Entity Framework 4 Code First CTP5 和 NUnit。 NUnit 是否有类似于 XUnit 中的回滚功能?

【问题讨论】:

    标签: sql-server entity-framework sqlite entity-framework-4 sql-server-ce


    【解决方案1】:

    如果您使用 XUnit (http://xunit.codeplex.com/) 之类的测试框架,它带有一个名为 [AutoRollback] 的功能,可以回滚测试中运行的事务,因此您的任何数据都不会改变!

    至于如何设置测试,我需要了解更多关于如何设置数据访问的信息。您是否使用了存储库模式? (Entity Framework 4 CTP 4 / CTP 5 Generic Repository Pattern and Unit Testable)。如果我能看到你的一些代码,它会有所帮助。下面是一个使用 XUnit 的示例集成测试:

    private readonly IUserRepository _repository;
    
    public UserRepositoryTests()
    {
        _repository = new UserRepository(base._databaseFactory);
    }
        
    [Fact, AutoRollback]
    public void Should_be_able_to_add_user()
    {
        var user = new User{Name = "MockName"};
        _repository.Add(user);
        base._unitOfWork.Commit();
        
        Assert.True(user.Id > 0);
    }
    

    所以上面的测试将一个用户添加到我的数据库中,然后检查它的 Id 属性以检查 SQL Server 是否为它自动生成了一个 Id。因为该方法是用 AutoRollback 属性修饰的,所以在方法结束后数据会从我的数据库中删除!

    【讨论】:

    • 谢谢。请看我更新的帖子。您是否使用实时数据库进行测试?您使用什么类型的数据库?你有一个单独的项目吗?您的数据库是否驻留在此项目中。如果您需要了解其他信息,请告诉我:)
    • 看过你的 1 篇文章,难道你没有一个示例项目,我可以看看你是如何实现的吗?
    • @Brendan 我没有示例站点,但很乐意为您提供帮助。如果您的项目很小,您可以添加一个名为“Tests”的新类库。您将在该应用程序中保存所有测试,并且它将保存对您的 MVC 应用程序的引用(如果不在您的 MVC 应用程序中,则保存您的数据访问的项目)。使用 AutoRollback 属性,您可以测试您的实时开发数据库的代理,它会将所有内容恢复到测试运行之前的状态。我使用 MS SQL Server,但 SQL CE 也一样!另外,我推荐 Pro ASP.NET MVC 2 rdir.in/PROMVC2
    • @Brendan 您可以查看此项目的代码以查看示例shrinkr.codeplex.com 注意:这不是一个简单的应用程序,如果您不熟悉 DDD,S.O​​.L.I.D.,可能不容易理解, CQS 等...
    • @Paul 您的用户 ID 肯定不是可为空的整数。所以你的 Assert 没有意义并且永远不会失败。
    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2011-04-06
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多