0

嗨,我只是在编写我的第一个单元测试,我有一个案例,我必须测试是否返回了正确的映射器。

这是我的代码:

public UserPersonalDetailsDTO GetUserPersonalDetails(int personId)
{
   var mapper = ServiceLocator.GetInstance<IMappingService<UserPersonalDetails, UserPersonalDetailsDTO>>();
   var userPersonalDetails = UnitOfWork.PersonData.GetUserPersonalDetails(personId);
   var userPersonalDetailsDTO = mapper.Map(userPersonalDetails);
   return userPersonalDetailsDTO;
}

如果我得到正确的映射器,我将如何测试?

编辑

我忘了提到我使用 Unity 作为我的 DI 框架,这是我的构造函数:

 public ProfileService(IEConnectUow uow, IValidationService validationService, IServiceLocator serviceLocator)
        : base(uow, serviceLocator)
    {
        m_ValidationService = validationService;
    }

我的 CUrrent 类继承自具有以下属性的 BaseCLass:

protected IEConnectUow UnitOfWork { get; set; }

    protected IServiceLocator ServiceLocator { get; set; }

    public BaseService(IEConnectUow uow, IServiceLocator serviceLocator)
    {
        UnitOfWork = uow;
        ServiceLocator = serviceLocator;
    }
4

2 回答 2

1

该代码确实很难进行单元测试。至少有两个依赖项是通过静态 ( ServiceLocator, UnitOfWork) 进入的。

我会将代码重构为以下内容

public class Whatever {

   private IMappingService<UserPersonDetails, UserPersonalDetailsDTO> mapper;

   private PersonData personData;

   public Whatever(IMappingService<UserPersonDetails, UserPersonalDetailsDTO> mapper, 
                   PersonData personData) {}

   public UserPersonalDetailsDTO GetUserPersonalDetails(int personId) {
       var userPersonalDetails = personData.GetUserPersonalDetails(personId);
       var userPersonalDetailsDTO = mapper.Map(userPersonalDetails);
       return userPersonalDetailsDTO;
   }
}

在任何类中,您现在都可以测试与传入的对象的交互。您不想测试该类中是否返回了正确的映射器。在单元测试中,理想情况下您只想测试类的逻辑及其与依赖项的交互。在这种情况下,我只是测试交互。 GetUserPersonalDetails与对象对话PersonData,并使用Mapper获得结果。

测试你得到正确的映射器不是这个类的责任。将该逻辑从某处(可能以 开始ServiceLocator)分解到具有自己依赖项的自己的类中,并验证它是否符合您的要求。

于 2013-07-02T08:28:56.033 回答
0

ServiceLocator是一些工厂类。如果ServiceLocator是你写的,你可以单独测试。如果它是一个库类,则测试该库(假设)。您可以测试是否GetInstance<IMappingService<UserPersonalDetails, UserPersonalDetailsDTO>>();为正确的类型调用了该方法。这可以通过一个模拟框架来完成。您为该GetInstance方法制作一个模拟,然后检查它是否被调用,您知道该GetInstance方法是正确的,因为您已经在其他地方对其进行了测试。

我的测试看起来像(伪代码):

Make mock ServiceLocator.GetInstance
Make mock UnitOfWork.PersonData.GetUserPersonalDetails
Make mock mapper.Map

call GetUserPersonalDetails(int personId)

check if ServiceLocator.GetInstance was correct
于 2013-07-02T08:26:27.463 回答