mardi 7 mars 2017

How to mokup RestSharp portable library in Unit Test

I would like to mockup the RestClient class for test purposes

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Threading.Tasks;
    using MyLibrary.Data.Dtos;
    using MyLibrary.Data.Services.Interface;
    using RestSharp.Portable;

    namespace MyLibrary.Data.Services
    {
        public class DataServices : IDataServices
        {
            private readonly IRestClient _restClient;


            public DataServices(IRestClient restClient)
            {
                _restClient = restClient;
            }

            public async Task<User> GetUserByUserName(string userName)
            {
                User user = null;

                // create a new request
                var restRequest = new RestRequest("User", Method.GET);
                // create REST parameters
                restRequest.AddParameter("userName", userName, ParameterType.QueryString);
                // execute the REST request
                var restResponse = await _restClient.Execute<User>(restRequest);
                if (restResponse.StatusCode.Equals(HttpStatusCode.OK))
                {
                    user = restResponse.Data;
                }
                return user;
            }

        }
    }

My test class :

using System.Net;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;
using MyLibrary.Data.Dtos;
using MyLibrary.Data.Services;
using RestSharp.Portable;

namespace MyIndosuez.Data.Test
{
    [TestClass]
    public class DataServicesTest
    {
        public static IRestClient MockRestClient<T>(HttpStatusCode httpStatusCode, string json)
        {
            var mockIRestClient = new Mock<IRestClient>();
            mockIRestClient.Setup(x => x.Execute<T>(It.IsAny<IRestRequest>()))
              .Returns(new RestResponse<T>
              {
                  Data = JsonConvert.DeserializeObject<T>(json),
                  StatusCode = httpStatusCode
              });
            return mockIRestClient.Object;
        }

        [TestMethod]
        public async void GetUserByUserName()
        {
            var dataServices = new DataServices(MockRestClient<User>(HttpStatusCode.OK, "my json code"));
            var user = await dataServices.GetUserByUserName("User1");
            Assert.AreEqual("User1", user.Username);
        }
    }
}

But I can't instanciate the RestResponse object, I've the following error:

          .Returns(new RestResponse<T>
          {
              Data = JsonConvert.DeserializeObject<T>(json),
              StatusCode = httpStatusCode
          });

Cannot access protected internal constructor 'RestResponse' here.

How can I workaround this ? I'm using the FubarCoder.RestSharp nuget package on a Xamarin portable Library.

Aucun commentaire:

Enregistrer un commentaire