单元测试这个简单功能(使用EF 5.0)的正确方法是什么,还是单元测试有意义?

时间:2013-05-23 17:25:54

标签: entity-framework unit-testing repository-pattern

我花了一些时间试图理解单元测试的主题,因为它与使用EF 5.0 / DbContext有关。以下功能是单元测试。根据我的基本理解,我似乎有以下选择。

  1. 我创建了一个存储库接口。一个是真正的实现,另一个是假的。假的将使用我将从实体对象创建的数据。在这种情况下,我可以创建一个List ...但问题似乎是linq->对象(测试)与linq-> EF不同,所以我真的不测试任何东西?

  2. 使用DBContext中的信息以某种方式创建一个小型测试数据库..然后将数据添加到数据库并检索它..虽然不知道我将如何做到这一点。如何在我的Dbcontext中创建一个DB作为MSunit测试运行的一部分?

  3. 不需要进行单元测试。它真的只是测试EF上下文的'Where'扩展方法吗?

  4. 那么..有人可以解释一下思考这个问题的正确方法而不会过于先进吗?当您从大多数演示的MVC控制器调用它们时,我理解单元测试存储库模式的基本概念。

       public class MSAManager// : IMSAManager
    {
        private MATT_LocalStatisticsEntities context = new MATT_LocalStatisticsEntities();
    
        //Takes series of FIPS codes and sees if they exist in the DB
        public bool IsPlaceExistsV1(string FIPS_SMA, string FIPS_StateCode, string FIPS_CountyCode, string FIPS_EntityCode, DateTime year)
        {
            var duplicate = context.Places.Where(x => ((x.FIPSMSA == FIPS_SMA) &&
                                                       (x.FIPSState == FIPS_StateCode) &&
                                                       (x.FIPSCounty == FIPS_CountyCode) &&
                                                       (x.FIPSEntity == FIPS_EntityCode) &&
                                                       (x.StartDate == year)
                                                      ));
    
            return (duplicate.Count() != 0);
        }
    

2 个答案:

答案 0 :(得分:1)

关于3(参见我对其余部分的评论):

是的,您需要进行单元测试,因为您正在测试的是副本是与FIPSMSAFIPSStateFIPSCountyStartDate相同的地方的地方。

编辑OP要求提供一个模拟示例:

这假设您使用MOC并且您有一个正在模拟的工作单元,它公开了一个名为SomeEntityRepository的存储库

Moq.Mock<IUnitOfWork> _mockUow;
_mockUow = new Moq.Mock<IUnitOfWork>();
var entity = new SomeEntity();
_mockUow.Setup(m => m.SomeEntityRepository.GetById(Moq.It.IsAny<int>())).Returns(entity);

然后,您可以将模拟工作单元注入到具有您要测试的方法的对象的构造函数中,或者注入您要测试的方法,假设构造函数或方法采用类型为{{{ 1}}

答案 1 :(得分:1)

您也可以执行集成测试,而不是直接单元测试。

您可以针对真实的EF DBContext进行集成测试, 只需在单元测试项目的App.config / Web.Config中给它一个不同的连接字符串。

阅读this及其所有答案。

您可以看到实施示例here