2017-10-17 7 views
1

Je veux tester cette méthode en utilisant Moq. Est-ce que quelqu'un peut me dire comment faire ça? Je joins l'ID utilisateur et la valeur dans la chaîne de requête. Comment imiter cela dans moq. Le nom de la classe est RestClient.cs. J'ai créé une interface appelée IRestClient. interface publique IRestClient { chaîne MakeRequest (chaîne ID utilisateur, valeur de chaîne); }Tests unitaires utilisant le framework Moq

Ceci est la méthode makeRequest de la classe RESTClient

public string MakeRequest(string userId,string value) 
{ 
    Logger.Info("Entering method MakeRequest()." + "Input Parameter: " + userId+Constant.NewLine+value); 
    string strResponseValue = string.Empty; 

    // The HttpWebRequest class allows you to programatically make web requests against an HTTP server. 
    // create the WebRequest instantiated for making the request to the specified URI. 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Constant.webServerURI+"?id="+userId + Constant.UserValueAppend + value); 

    //Gets or sets the method for the request.(Overrides WebRequest.Method.) 
    request.Method = httpMethod.ToString(); 

    //Initially response from webserver is set to null. 
    HttpWebResponse response = null; 

    try 
    { 
     // Get the response in the response object of type HttpWebResponse 
     // The request object of HttpWebRequest class is used to "get" the response (GetResponse()) from WebServer and store it in the response object 
     response = (HttpWebResponse)request.GetResponse(); 

     // We check that the response StatusCode is good and we can proceed 
     if (response.StatusCode != HttpStatusCode.OK) 
     { 
      Logger.Error("Error" + response.StatusCode.ToString()); 
      throw new ApplicationException(Constant.ErrorDisplay + response.StatusCode.ToString()); 
     } 

     // Process the response string 
     // We obtain the ResponseStream from the webserver using "get" (GetResponseStream()) 
     // The Stream Class provides a generic view of a sequence of bytes 

     using (Stream responseStream = response.GetResponseStream()) 
     { 
      if (responseStream != null) 
      { 
       using (StreamReader reader = new StreamReader(responseStream)) 
       { 
        //read the stream and store it in string strResponseValue 
        strResponseValue = reader.ReadToEnd(); 

        }//End of StreamReader 
      } 
     }//End of using ResponseStream 
    }// End of using Response 

    catch (Exception ex) 
    { 
     Logger.Error("Error" + ex.Message.ToString()); 
     strResponseValue = ("Error " + ex.Message.ToString()); 
    } 
    finally 
    { 
     if (response != null) 
     { 
      ((IDisposable)response).Dispose(); 
     } 
    } 
    //return the string strResponseValue 
    Logger.Info("Leaving method MakeRequest." + "Output parameter: " + strResponseValue); 
    return strResponseValue; 
} 

Ceci est ma tentative de création de la moq dans ma classe de unittest appelé RestClientTests.cs

[TestMethod] 
public void TestMethod1() 
{ 
    var expected = "response content"; 
    var expectedBytes = Encoding.UTF8.GetBytes(expected); 
    var responseStream = new MemoryStream(); 
    responseStream.Write(expectedBytes, 0, expectedBytes.Length); 
    responseStream.Seek(0, SeekOrigin.Begin); 

    var mockRestClient = new Mock<IRestClient>(); 
    var mockHttpRequest = new Mock<HttpWebRequest>(); 

    var response = new Mock<HttpWebResponse>(); 
    response.Setup(c => c.GetResponseStream()).Returns(responseStream); 

    mockHttpRequest.Setup(c => c.GetResponse()).Returns(response.Object); 

    var factory = new Mock<IHttpWebRequestFactory>(); 
    factory.Setup(c => c.Create(It.IsAny<string>())).Returns(mockHttpRequest.Object); 

    var actualRequest = factory.Object.Create("http://localhost:8080"); 
    actualRequest.Method = WebRequestMethods.Http.Get; 

    string actual; 

    using (var httpWebResponse = (HttpWebResponse)actualRequest.GetResponse()) 
    { 
     using (var streamReader = new StreamReader(httpWebResponse.GetResponseStream())) 
     { 
      actual = streamReader.ReadToEnd(); 
     } 
    } 

    mockRestClient.Setup(moq => moq.MakeRequest("xxx", "s")).Returns(actual); 
} 

mon interface IhttpWebRequestFactory ressemble ce:

interface IHttpWebRequestFactory 
{ 
    HttpWebRequest Create(string uri); 

} 

Je ne suis pas Je suis sur comment le tester

Répondre

0

Votre méthode de test actuelle n'a aucun sens pour moi.

Si vous testez votre classe RestClient, qui implémente IRestClient, vous n'avez pas besoin de simuler IRestClient lui-même. Vous avez besoin de se moquer de toutes les dépendances externes à la place - vous avez déjà créé une simulation pour IHttpWebRequestFactory, maintenant vous devez l'injecter dans un objet testé. Je ne vois pas le reste de votre classe, mais je suppose que votre objet WebRequest est de type IHttpWebRequestFactory - vous devez lui attribuer votre maquette d'usine.

Vous devez maintenant définir vos scénarios de test. Je peux rapidement voir la suite (mais vous pouvez avoir plus de cause):

  1. StatusCode n'est pas OK. StatusCode est OK, mais responseStream est null.
  2. StatusCode est OK, responseStream n'est pas nul, la méthode s'exécute correctement.
  3. Une exception est levée dans le bloc try.

Maintenant, pour chaque cas de test, vous devez préparer une configuration et une validation correctes. Par exemple, pour le 1er, vous avez besoin que votre usine mockée renvoie une requête simulée qui renvoie une réponse simulée avec un code de résultat incorrect. Maintenant, vous devez appeler votre objet réel. En tant que validation, vous devez vérifier que ApplicationException est levée et que tous vos simulacres ont été effectivement appelés.

Ok, ceci est une configuration partielle pour le 2ème cas de test. Il préparera l'usine moquée qui renvoie la demande moqué qui renvoie une réponse moquée avec le code OK:

var response = new Mock<HttpWebResponse>(); 
response.SetupGet(c => c.StatusCode).Returns(HttpStatusCode.OK); 

var mockHttpRequest = new Mock<HttpWebRequest>(); 
mockHttpRequest.Setup(c => c.GetResponse()).Returns(response.Object); 

var factory = new Mock<IHttpWebRequestFactory>(); 
factory.Setup(c => c.Create(It.IsAny<string>))).Returns(mockHttpRequest.Object); 
+0

Pourriez-vous donner un exemple de ce que vous venez de dire par le code .. de dire le code d'état est ok –

+0

Je suis en train de tester la méthode makeRequest dans la classe Restclient –

+1

merci beaucoup @arghtype –