2011-12-07 78 views
3

我是Pex和痣的新手。我想在我的代碼上運行Pex,但是我使用了構造函數注入。有沒有辦法指導Pex如何注入構造函數?Pex&痣 - 依賴注射

編輯

public UserLogic(IUserRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 

    public int GetUsersAge(int id) 
    { 
     User user = _userRepository.GetById(id); 
     DateTime DOB = user.DOB; 
     DateTime now = DateTime.Today; 
     int age = now.Year - DOB.Year; 
     if (DOB > now.AddYears(-age)) age--; 
     return age; 
    } 

我需要注入存根userRepository。當調用_userRepository.GetById(id)時,Pex失敗並返回一個NullReferenceException。我一直在使用Moq進行單元測試,但是我想切換到pex和痣

我應該使用PexFactory創建我的存根嗎?

+0

顯示一些代碼,你可以用痣更換任何代碼。 – Peter

+0

這不完全正確,有一些情況下你將無法使用痣(例如http://social.msdn.microsoft.com/Forums/en-US/pex/thread/c262d8f1-246e-4157 -a7b4-f7ddeaf1890c /) – Gorgsenegger

+0

還有一件事,我認爲如果你有機會從頭開始設計你的應用程序,那麼只要你正確地接口等,你通常應該對MOQ適用。 痣可以幫助遺留的代碼,你可能無法/不允許/ ...改變了。 – Gorgsenegger

回答

1

嘗試將一個痣存根類型傳遞給Pex生成的參數化測試。要創建參數化測試,請右鍵單擊要探索的類,然後選擇PEX>創建參數化單元測試。這會在包含參數的測試類中生成一個方法。單個測試調用這個參數化測試,發送單個測試參數。

當被測代碼通過參數(它有一個接口類型參數)使用依賴注入時,Pex生成的參數化測試方法也將包含相同的接口類型參數。您可以編寫自己的測試方法,也可以調用參數化方法,爲其提供自己的值,包括接口類型。只要確保不要將它們寫入Pex生成的文件中!

我還建議您使用Mole Stub類型來進行單元測試注入。 Microsoft Moles Reference Manual是開始學習如何在單元測試中使用Moles的好地方。當您創建參數化測試時,將爲您的界面創建一個摩爾存根類型。只需配置您的存根類型的繞道,然後將其傳遞給參數化測試。

創建存根類型的彎路非常容易。我建議在測試項目中創建一個配置方法,配置常用的彎路。我通常添加一個枚舉標誌作爲這個方法的一個參數,所以我可以很容易地告訴它在特定的類型上創建哪些彎路,所有這些都在一次調用中完成。

樣品枚舉:

[Flags()] 
public enum MoleConfigurations 
{ 
    MoleSqlClientObjects, 
    DisableDirectory_Exists, 
    DisableEventLogExtensions, 
    DisableInitializeDatabaseObjects, 
    DisableInitializeThreadingObjects, 
    DisableQueueExistingDataFiles, 
    DisableConstructor 
} 
+0

嗨,邁克。我剛剛閱讀了您博客上的pex帖子。感謝您的迴應。有可能或者你提供一個快速的例子。我用一個簡單的例子更新了我的帖子。 – ministrymason