2013-07-02 36 views
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; 
    } 

我目前的類從具有這種特性的基類繼承:

protected IEConnectUow UnitOfWork { get; set; } 

    protected IServiceLocator ServiceLocator { get; set; } 

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

回答

0

您的ServiceLocator是一些工廠類。如果你寫的是ServiceLocator,你可以單獨測試。如果它是一個庫文類,庫文件將被測試(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 
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; 
    } 
} 

在任何類你現在可以測試與您傳遞的對象的交互。你不希望被測試時,返回的正確映射器在這個班上。在單元測試中,理想情況下,您只想測試類的邏輯及其與依賴關係的交互。在這種情況下,我只是測試交互。 GetUserPersonalDetailsPersonData對象進行對話,並使用Mapper來獲得結果。

測試你得到正確的映射器不是這個類的責任。將邏輯放在某個地方(可能從ServiceLocator開始)放入其具有自己的依賴項的自己的類中,並驗證它是否符合您的要求。

+1

ServiceLocator和UnitOfWork都是在基類中定義的屬性,我只是爲它們添加了代碼 – aleczandru

+0

Fab。同樣的觀點仍然適用。測試您獲得正確的映射器是服務定位器類的屬性,而不是您的配置文件服務。 –

相關問題