2014-03-05 65 views
1

這是我爲調查猴子api oauth token的webRequest Post方法的實現。我正在爲以下代碼編寫單元測試。嘲笑同一類中的方法

public string GetSurveyMonkeyToken(string apiKey, string clientSecret, string tempAuthCode, string redirectUri, string clientId) 
{ 
    if (!VerifyRedirectedTempCode(tempAuthCode))//this method is in the same class which checks the temp code valid(true) or not(false) 
    { 
     return null; 
    } 
    else 
    { 
     WebRequestForTokenOfSurveyMonkey = GetWebRequestForHttpPostOfSurveyMonkeyToken(apiKey, clientSecret, tempAuthCode, redirectUri, clientId); 
     using (HttpWebResponse responseHttpPostForToken = GetResponse(WebRequestForTokenOfSurveyMonkey))//Getresponse method is in the same class which returns this (HttpWebResponse)webRequestObject.GetResponse() 
     { 
      string tokenJson = new StreamReader(responseHttpPostForToken.GetResponseStream()).ReadToEnd(); 
      AccessToken accesstokenObj = JsonConvert.DeserializeObject<AccessToken>(tokenJson); 
      string accessTokenSurvey = accesstokenObj.access_token.ToString(); 
      return (accesstokenObj.access_token.ToString()); 
     } 
    } 
} 

現在上面的代碼工作正常,但我有一個問題編寫單元測試這個method.below是我的單元測試對他們來說,一個測試,讓我嘲笑我的方法返回false工作正常返回null。

[Test] 
public void GetSurveyMonkeyTokenTestWithValidTempCode() 
{ 
    var mockedSurveyMonkeyToken = new Moq.Mock<SurveyMonkeyAPIService>(); 
    mockedSurveyMonkeyToken.CallBase = true; 
    mockedSurveyMonkeyToken.Setup(a => a.VerifyRedirectedTempCode(It.IsAny<string>())).Returns(true); 
    var mockRequest = mockedSurveyMonkeyToken.Object.GetWebRequestForHttpPostOfSurveyMonkeyToken(TestData.TestData.SampleApiKey, TestData.TestData.SampleClientSecret, TestData.TestData.SampleTempAuthCode, TestData.TestData.SampleRedirectUri, TestData.TestData.SampleClientId); 
    mockedSurveyMonkeyToken.VerifyAll(); 
} 

此測試方法中的誤差是 Moq.MockVerificationException:下面設置不匹配: SurveyMonkeyAPIService一個=> a.VerifyRedirectedTempCode(It.IsAny())

中有什麼問題我的Tests.Did正確地編寫測試方法。我正在第一次編寫httpwebrequest測試方法。

回答

1

我同意mezoid,你的測試是非常非正統的。您的測試失敗的原因是您直接撥打GetWebRequestForHttpPostOfSurveyMonkeyToken方法,而不是GetSurveyMonkeyToken方法。 GetWebRequestForHttpPostOfSurveyMonkeyToken想必不會撥打VerifyRedirectedTempCode,因爲您已撥打GetSurveyMonkeyToken

爲了讓測試通過,也許你可以行

var mockRequest = mockedSurveyMonkeyToken.Object.GetWebRequestForHttpPostOfSurveyMonkeyToken(TestData.TestData.SampleApiKey, TestData.TestData.SampleClientSecret, TestData.TestData.SampleTempAuthCode, TestData.TestData.SampleRedirectUri, TestData.TestData.SampleClientId); 

改變

var mockRequest = mockedSurveyMonkeyToken.Object.GetSurveyMonkeyToken(TestData.TestData.SampleApiKey, TestData.TestData.SampleClientSecret, TestData.TestData.SampleTempAuthCode, TestData.TestData.SampleRedirectUri, TestData.TestData.SampleClientId); 

但我會考慮重新設計你的應用程序有點分離出你想要的單位測試。也許你應該向codereview stackexchange網站發佈一個問題。

+0

非常感謝 – user3324848

2

我想你可能會錯誤地應用Mocking的概念。

嘲諷的目的應該是被用於在測試模擬出的依賴性一類。

不幸的是,你似乎在做的是嘲笑正在測試的類的方法。當你剛開始時,這是一個容易犯的錯誤。但是,這樣做會破壞單元測試的全部目的,因爲您的目標應該是獨立測試課程的功能。如果你嘲笑這個類的方法,你將會有效地取代你試圖測試的實現。

在看單元測試時,您會發現整個測試都圍繞着模擬var mockedSurveyMonkeyToken = new Moq.Mock<SurveyMonkeyAPIService>();進行。

你想要做的是確定你的類的依賴是什麼,然後將它們模擬出來,以便在測試類的公共方法時控制它們的作用。

如果SurveyMonkeyAPIService是依賴項,那麼您將該模擬傳遞給待測試的類。 (例如var cut = new MyClassUnderTest(surveyMonkeyAPIServiceMock)

但是,如果SurveyMonkeyAPIService是我正在測試的類,那麼您將需要在測試中創建此類的實例並傳遞任何依賴關係的模型。將是HttpWebResponse webRequestObject

您的測試將不得不像下面這樣:

var sm = new SurveyMonkeyAPIService(webRequestObjectMock); //create the class under test. Arrange 
sm.GetSurveyMonkeyToken(...); //exercise the class under test. Act 
webRequestObjectMock.Verify(...); //verify that the mock was exercised as expected. Assert 

注:安排,法,斷言是三個步驟三A單元測試...

有關如何模擬HttpWebResponse依賴關係的示例,請參閱this question

+0

謝謝你,我會考慮這個,是的,我第一次寫單元測試。 – user3324848