2016-09-14 50 views
0

另一種方法做我很新的起訂量,我不知道這是甚至可能的,但我們說,如果我有一個方法命名爲GeneratedHashedAndSaltedPassword()和我提出來一個電話從法該方法命名CheckUsersPassword()是有,我可以從單元測試起訂量表達寫,說任何機會:確認GeneratedHashedAndSaltedPassword是從調用方法CheckUsersPassword檢查是否調用一個方法是從使用起訂量

我會知道CheckUsersPassword方法正確執行,如果它調用GeneratedHashedAndSaltedPassword方法沒有任何例外。

什麼我現在並不多,因爲我有困難的時候與起訂量和它的邏輯。

[Test] 
public void CheckIfPasswordIsHashed_Test() 
{ 
    var securityServiceMock = new Mock<User>(); 
    securityServiceMock.Setup(m => m.CheckUsersPassword(It.IsAny<string>())).Returns(true); 
    securityServiceMock.VerifyAll(); 
} 

我試圖安裝CheckUsersPassword,但我仍然不知道如何或者即使我可以瓶坯驗證我需要。有人對這類問題有更多的經驗嗎?

這是CheckUserPassword做:

public bool CheckUsersPassword(string password) 
{ 
    return SecurityService.GenerateHashedAndSaltedPassword(password, Salt) == Password; 
} 

它使簡單的調用GenerateHashedAndSaltedPassword(),並比較了當前用戶的密碼造成的。

+0

SecurityService實例是否注入到包含'CheckUsersPassword'方法的類的構造函數中? – Corporalis

+0

確實看起來像一個公共靜態方法給我。 – Fran

回答

1

重要的是,其與單元測試和該代碼的外部依賴性測試的代碼之間進行區分。外部依賴被MOQ嘲弄,但測試代碼必須實例化並直接在單元測試中調用。

在你的問題,我假設你測試方法CheckUsersPasswordSecurityService是應該嘲笑的依賴項。

在測試中,你必須創建類的實例(其中包含測試方法),並通過依賴模仿這個測試類莫名其妙。

[Test] 
public void CheckIfPasswordIsHashed_Test() 
{ 
    // Arrange 
    // Mock dependency which is the service and setup 
    // GenerateHashedAndSaltedPassword so it does what you need 
    var securityServiceMock = new Mock<User>(); 
    securityServiceMock.Setup(m => m.GenerateHashedAndSaltedPassword(
     It.IsAny<string>(), 
     ItIsAny<Salt>()) 
    .Returns(Password); 

    // TestedClass needs a place where the mocked instance can be injected, 
    // e.g. in constructor, or public property 
    var testedClass = new TestedClass(securityServiceMock.Object); 

    // Act 
    testedClass.CheckUsersPassword(password); 

    // Assert 
    securityServiceMock.Verify(m => m.GenerateHashedAndSaltedPassword(
     It.IsAny<string>(), 
     ItIsAny<Salt>()), 
    Times.Once()); 
} 
+0

謝謝。與此同時,我意識到在被測試的單元中的外部依賴必須被Moq嘲弄,但測試的代碼必須是真實的實例:)但是我們在這裏有一個很好的解釋是很棒的:) @dee –

相關問題