2011-06-06 49 views
4

我在创建数据访问层,以我的一个项目的过程是,它只是一个门面接口实体框架,所以大部分的底层调用不包含逻辑,除了调用实体框架方法。EF,DAL门面和单元测试

现在,我的一个同事说我应该单元测试,即使它们包含一个电话,在我看来,这听起来过于激进,对我来说,似乎是一个膨胀,是不是每个单独的方法?

有没有真正的情况下,以测试在这里除了进行测试,我已经做参数,我看不出有任何理由来测试没有任何控制结构的方法。

您的意见是?

/// <summary> Adds the entity to the context. </summary> 
    /// <param name="entity"> The entity to add. </param> 
    public void Add(object entity) 
    { 
     var name = GetEntitySetName(entity); 

     Context.AddObject(name, entity); 
    } 

    /// <summary> Updates the entity in the context with the given entity data; otherwise, attaches it to the context in attempt to update the related record in the data source on the next call to commit. </summary> 
    /// <param name="entity"> The entity to use for the update. </param> 
    public void Update(object entity) 
    { 
     var name = GetEntitySetName(entity); 

     var manager = Context.ObjectStateManager; 

     EntityKey key = Context.CreateEntityKey(name, entity); 

     ObjectStateEntry entry; 

     if (manager.TryGetObjectStateEntry(key, out entry)) 
     { 
      entry.ApplyCurrentValues(entity); 
     } 
     else 
     { 
      Context.AttachTo(name, entity); 

      manager.ChangeObjectState(entity, EntityState.Modified); 
     } 
    } 

更新内部的语境和添加方法是伪造的,但就像真实的一个,我知道,在大多数情况下,这将是极端的,但我们不能在目前的测试对数据库,至少不阶段。

因此,我的这位同事说我应该测试这个“添加”方法作为我的Uni测试的一部分,让我感到非常困惑,他声称每一个公共方法都需要单元测试。

在我的脑海里似乎激进的,因为它就像质疑调用实体框架的.AddObject是否起作用,我认为会的。

我真正想知道的是你是否将测试没有控制结构,他们确实需要进行测试,以第三方库的调用方法?我想不是。

回答

2

测试方法,其包装EF功能不是单元测试,但集成测试,它实际上有一个理由,因为它验证你的DAL正在与一个真正的数据库。它不是测试它的参数或测试它的参数,而是测试映射与真实数据库一起工作,记录是真正读取还是持久化等。

+0

+1您需要测试某些时候,当您要求实体,你期望的实体被加载。这应该通过一个受控的数据库来完成,理想情况是在每个测试(最好但最慢)或测试夹具(不如很好但可能较快)或集成测试运行之前可以重新创建或重置该数据库。如果代码只读,那么这不是很重要,但如果它修改,那么它是。 – 2011-06-07 08:47:44

+0

不幸的是,一旦你使用EntityFramework和EDMX文件切换数据库到内存中,一个并不容易,因为数据库提供者在文件中被硬编码。 – 2011-06-07 08:49:50

+0

你在测试什么?你的测试方法中是否有任何实体queris的linq?或者一些代码CUD代码?在这种情况下,单元测试将不足以测试该方法。 – 2011-06-07 14:33:16