测试是否返回正确的映射器

时间:2013-07-02 08:19:44

标签: c# unit-testing

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

这是我的代码:

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;
    }

2 个答案:

答案 0 :(得分:1)

该代码实际上很难进行单元测试。至少有两个依赖项来自静态(ServiceLocatorUnitOfWork)。

我会将代码重构为以下

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;
   }
}

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

测试您获得正确的映射器不是此类的责任。将逻辑输出到某个地方(可能以ServiceLocator开头)到自己的具有自己的依赖关系的类中,并验证它是否符合您的要求。

答案 1 :(得分:0)

你的ServiceLocator是一些工厂级的。如果ServiceLocator由你写,你可以单独测试。如果它是一个libary类,则对libary进行测试(assumue)。您可以测试是否为正确的类型调用了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