代码之家  ›  专栏  ›  技术社区  ›  twk

使用内存中的SQLite测试基于EF SQL Server的应用程序?

  •  2
  • twk  · 技术社区  · 16 年前

    我正在使用带有实体框架的SQLServer在.NET4中开发带有VS2010RC的web应用程序。我想用样本数据准备测试数据库。

    如果使用SQLite,我可以使用EF为SQL Server数据库创建的相同模型吗?如何将模式从SQL Server迁移到内存中的SQLite?

    如何测试使用EF和SQL Server的代码?

    谢谢分享。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Craig Stuntz    16 年前

    我使用LINQ来创建对象和DI。

    假设我有一个使用存储库的服务:

    public FooService : Service, IFooService
    {
        private IFooRepository Repository { get; set; }
    
        public GetSpecialFoos()
        {
            return from f in Repository.SelectAll()
                   where f.IsSpecial
                   select f;
        }
    
        public FooService(IFooRepository repository)
        {
            this.Repository = repository;
        }
    }
    

    现在我可以使用构造函数注入来注入模拟存储库进行测试。通常,您会为此使用DI框架。但重要的是,模拟存储库可以使用LINQ访问对象:

    public MockFooRepository : IFooRepository
    {
         public IList<Foo> Data { get; set; }
    
         public IQueryable<Foo> SelectAll()
         {
             return Data.AsQueryable();
         }
    }
    

    现在我可以测试:

    [TestMethod]
    public void GetSpecialFoos_returns_only_special_foos()
    {
        var specialId = 1;
        var notSoSpecialId = 2;
        var foos = new List<Foo> 
        {
             new Foo
             {
                 Id = specialId,
                 IsSpecial = true
             },
             new Foo
             {
                 Id = notSoSpecialId,
                 IsSpecial = false
             }
        }
        // use a DI framework here instead, in the real world
        var repository = new MockFooRepository
        {
            Data = foos
        };
        var service = new FooService(repository);
    
        var actual = service.GetSpecialFoos();
    
        var returned = actual.First();
        Assert.AreEqual(true, returned.IsSpecial);
        Assert.AreEqual(specialId, returned.Id);
    }
    
    推荐文章