2014-03-05 43 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