0

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

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

  2. 以某种方式使用来自 DBContext 的信息创建一个小型测试数据库。然后将数据添加到数据库并检索它。虽然不知道我会怎么做。作为 MSunit 测试运行的一部分,如何获取从我的 Dbcontext 创建的数据库?

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

所以..有人可以解释一下思考这个问题的正确方法吗?当您从大多数演示的 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);
    }
4

2 回答 2

1

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

是的,您需要进行单元测试,因为您正在测试的是副本是具有相同FIPSMSA,FIPSState和另一个地方的地方FIPSCountyStartDate

编辑 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);

然后,您将模拟工作单元注入具有您希望测试的方法的对象的构造函数或您希望测试的方法,假设构造函数或方法采用类型为的参数IUnitOfWork

于 2013-05-23T17:44:29.050 回答
1

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

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

阅读本文及其所有答案。

您可以在此处查看实现示例

于 2013-05-23T18:05:21.970 回答