Hi,
I am new to justmock and need help in mocking the below code.I have a WCF data service method which process the service URI and gives out a XML result. I am not sure on how to mock the HTTP request and response, especially assigning content type etc.Can anybody help out with below.Thanks in advance.
Thanks,
Divya
I am new to justmock and need help in mocking the below code.I have a WCF data service method which process the service URI and gives out a XML result. I am not sure on how to mock the HTTP request and response, especially assigning content type etc.Can anybody help out with below.Thanks in advance.
// Obtain an HTTP web Request object for the desired URI var Request = WebRequest.Create(strUri) as HttpWebRequest; if (Request != null) { Request.KeepAlive = false; Request.Method = "GET"; Request.ContentType = "application/ems-v3+xml"; // Obtain the HTTP web response using (var Response = Request.GetResponse() as HttpWebResponse) { // Read the response text stream (the XML) into a local string if (Response != null) using (var ResponseStreamReader = new StreamReader(Response.GetResponseStream())) { //get XML Result result = ResponseStreamReader.ReadToEnd(); } } }Thanks,
Divya
4 Answers, 1 is accepted
0
Accepted
Hi Divya,
Thank you for contacting our forums.
Let's assume we have similar system under test:
Now, to test the SomeMethod, we need to isolate the HttpRequest and HttpResponse dependencies.
With the commercial version of JustMock, you can directly do the following:
I believe, this is simple enough :).
However, if you are using the free version of JustMock, you will need to follow a bit more complicated approach. I used this blog post for assistance and I managed to isolate your method from the HttpRequest and the HttpResponse dependencies:
First, I constructed the CustomWebRequestCreate class, note it should inherit the IWebRequestCreate interface:
This is the same class as in the above blog post, but the Moq arrangements in the
Next, I was able to write the following test method:
Here, the important part is that you need to register your custom class, in order to be used for the Urls in your web request calls.
I hope this helps. Please, let me know if I can be in further assistance.
Regards,
Kaloyan
Telerik
Thank you for contacting our forums.
Let's assume we have similar system under test:
class SUT{ public string result; public void SomeMethod(string strUri) { // Obtain an HTTP web Request object for the desired URI var Request = WebRequest.Create(strUri) as HttpWebRequest; if (Request != null) { Request.KeepAlive = false; Request.Method = "GET"; Request.ContentType = "application/ems-v3+xml"; // Obtain the HTTP web response using (var Response = Request.GetResponse() as HttpWebResponse) { // Read the response text stream (the XML) into a local string if (Response != null) using (var ResponseStreamReader = new StreamReader(Response.GetResponseStream())) { //get XML Result result = ResponseStreamReader.ReadToEnd(); } } } }}With the commercial version of JustMock, you can directly do the following:
[TestMethod]public void SomeMethod_OnExecute_ShouldUpdateResultProperty_JMComercial(){ // ARRANGE // Creating mock objects for HttpWebRequest and HttpWebResponse. var httpRequest = Mock.Create<HttpWebRequest>(); var httpResponse = Mock.Create<HttpWebResponse>(); // Arranging: When the static WebRequest.Create() method is called with any string argument, // it should return the mocked httpRequest object. Mock.Arrange(() => WebRequest.Create(Arg.AnyString)).Returns(httpRequest); // When the GetResponse() method is called from the httpRequest instance, // it should return the mocked httpResponse object. Mock.Arrange(() => httpRequest.GetResponse()).Returns(httpResponse); // When the GetResponseStream() method is called from the httpResponse instance, // it should return new MemoryStream(). Mock.Arrange(() => httpResponse.GetResponseStream()).Returns(new MemoryStream()); // ACT var sutMock = new SUT(); sutMock.SomeMethod("test"); // ASSERT - We assert that the result property is not null at the end of the test. Assert.IsNotNull(sutMock.result);}However, if you are using the free version of JustMock, you will need to follow a bit more complicated approach. I used this blog post for assistance and I managed to isolate your method from the HttpRequest and the HttpResponse dependencies:
First, I constructed the CustomWebRequestCreate class, note it should inherit the IWebRequestCreate interface:
public class CustomWebRequestCreate : IWebRequestCreate{ /// <summary> /// The web request. /// </summary> private static WebRequest nextRequest; /// <summary> /// Internally held lock object for multi-threading support. /// </summary> private static object lockObject = new object(); /// <summary> /// Gets or sets the next request object. /// </summary> public static WebRequest NextRequest { get { return nextRequest; } set { lock (lockObject) { nextRequest = value; } } } /// <summary> /// Creates the new instance of the CustomWebRequest. /// </summary> /// <param name="uri">The given Uri</param> /// <returns>An instantiated web request object requesting from the given Uri.</returns> public WebRequest Create(Uri uri) { return nextRequest; } /// <summary> /// Creates a Mock Http Web request /// </summary> /// <returns>The mocked HttpRequest object</returns> public static HttpWebRequest CreateMockHttpWebRequestWithGivenResponseCode(HttpStatusCode httpStatusCode) { var response = Mock.Create<HttpWebResponse>(); Mock.Arrange(() => response.StatusCode).Returns(httpStatusCode); Mock.Arrange(() => response.GetResponseStream()).Returns(new MemoryStream()); var request = Mock.Create<HttpWebRequest>(); Mock.Arrange(() => request.GetResponse()).Returns(response); NextRequest = request; return request; }}CreateMockHttpWebRequestWithGivenResponseCode method have been replaced with their JustMock equivalents.Next, I was able to write the following test method:
[TestMethod]public void SomeMethod_OnExecute_ShouldUpdateResultProperty_JMFree(){ // ACT // Registering the CustomWebRequestCreate class. WebRequest.RegisterPrefix("http://testService.mywebservice.com", new CustomWebRequestCreate()); CustomWebRequestCreate.CreateMockHttpWebRequestWithGivenResponseCode(HttpStatusCode.Forbidden); var sutMock = new SUT(); sutMock.SomeMethod("http://testService.mywebservice.com"); // ASSERT - We assert that the result property is not null at the end of the test. Assert.IsNotNull(sutMock.result);}I hope this helps. Please, let me know if I can be in further assistance.
Regards,
Kaloyan
Telerik
0
Divya
Top achievements
Rank 1
answered on 12 Aug 2013, 06:49 AM
Hi Kaloyan ,
Thank you so much for the detailed reply , I now understand and can implement the below in my project.
Regards,
Divya
Thank you so much for the detailed reply , I now understand and can implement the below in my project.
Regards,
Divya
0
Hi again Divya,
I am glad this helped you out.
Please, do not hesitate to contact us again if there is anything else we could assist you with.
Regards,
Kaloyan
Telerik
I am glad this helped you out.
Please, do not hesitate to contact us again if there is anything else we could assist you with.
Regards,
Kaloyan
Telerik
0
netcana
Top achievements
Rank 1
answered on 12 Oct 2016, 07:48 AM
thanks you for sharing such information with us nice thread
