Unit testing EF、DAL和单元测试

Unit testing EF、DAL和单元测试,unit-testing,entity-framework,data-access-layer,Unit Testing,Entity Framework,Data Access Layer,我正在为我的一个项目创建一个数据访问层,它只是实体框架的一个门面接口,因此大多数底层调用除了调用实体框架方法之外不包含任何逻辑 现在,我的一位同事说,我应该对每个方法进行单元测试,即使它们只包含一个调用。在我看来,这听起来太激进了,对我来说,这似乎是一个膨胀,是吗 除了测试我已经做过的参数之外,这里没有实际的测试案例,我认为没有理由测试没有任何控制结构的方法 你怎么看 /// <summary> Adds the entity to the context. </summary

我正在为我的一个项目创建一个数据访问层,它只是实体框架的一个门面接口,因此大多数底层调用除了调用实体框架方法之外不包含任何逻辑

现在,我的一位同事说,我应该对每个方法进行单元测试,即使它们只包含一个调用。在我看来,这听起来太激进了,对我来说,这似乎是一个膨胀,是吗

除了测试我已经做过的参数之外,这里没有实际的测试案例,我认为没有理由测试没有任何控制结构的方法

你怎么看

/// <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);
        }
    }
///将实体添加到上下文中。
///要添加的实体。
公共void添加(对象实体)
{
var name=GetEntitySetName(实体);
AddObject(名称、实体);
}
///使用给定实体数据更新上下文中的实体;否则,将其附加到上下文中,以便在下次调用commit时更新数据源中的相关记录。
///要用于更新的实体。
公共无效更新(对象实体)
{
var name=GetEntitySetName(实体);
var-manager=Context.ObjectStateManager;
EntityKey=Context.CreateEntityKey(名称、实体);
ObjectStateEntry条目;
if(manager.TryGetObjectStateEntry(key,out entry))
{
条目.ApplyCurrentValues(实体);
}
其他的
{
上下文。附件(名称、实体);
ChangeObjectState(实体,EntityState.Modified);
}
}
Update和Add方法中的上下文是伪造的,但行为与真实的相似,我知道在大多数情况下这是极端的,但我们无法对数据库进行测试,至少在当前阶段不能

说到这里,我的一位同事说我应该测试这个“Add”方法作为我的Uni测试的一部分,这让我很困惑,他声称每个公共方法都需要单元测试

在我看来,这似乎很激进,因为这就像是在质疑实体框架对.AddObject的调用是否会起作用,我认为它会起作用


我真正想知道的是,您是否会测试那个些并没有控制结构的方法,并且测试对第三方库的调用时确实需要这些方法?我认为不是。

封装EF特性的测试方法不是单元测试,而是集成测试,它实际上是有原因的,因为它验证了DAL正在使用真实的数据库。它不是关于测试它的参数或其他任何东西,而是关于测试映射是否与真实数据库一起工作,记录是否真正被读取或持久化,等等。

+1您需要在某个点进行测试,当您请求一个实体时,您期望的实体是否已加载。这应该使用受控数据库来完成,理想情况下,该数据库位于内存中,并且可以在每次测试(最好但最慢)或测试夹具(不太好但可能更快)或集成测试运行之前重新创建或重置。如果代码只读取,那么这就不那么重要了,但是如果它修改了,那么就很重要了。不幸的是,一旦您使用EntityFramework和EDMX文件,将数据库切换到内存中就不那么容易了,因为数据库提供程序是在文件中硬编码的。您在测试什么?在您测试的方法中是否存在linq到实体查询?还是一些代码?在这种情况下,单元测试将不足以测试该方法。