您好我正在编写我的第一个单元测试,我有一个案例,我必须测试是否返回正确的映射器。
这是我的代码:
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;
}
答案 0 :(得分: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
开头)到自己的具有自己的依赖关系的类中,并验证它是否符合您的要求。
答案 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