Me gustaría hacer una maqueta de la clase RestClient con fines de prueba
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; } }Mi clase de prueba:
[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); } } Pero no puedo instanciar el objeto RestResponse , tengo el siguiente error:
.Returns(new RestResponse<T> { Data = JsonConvert.DeserializeObject<T>(json), StatusCode = httpStatusCode });No se puede acceder al constructor interno protegido 'RestResponse' aquí.
¿Cómo puedo solucionar esto? Estoy usando el paquete nuget FubarCoder.RestSharp en una biblioteca portátil de Xamarin.
IRestResponse<T> y devolver eso
public static IRestClient MockRestClient<T>(HttpStatusCode httpStatusCode, string json) where T : new() { var data = JsonConvert.DeserializeObject<T>(json) var response = new Mock<IRestResponse<T>>(); response.Setup(_ => _.StatusCode).Returns(httpStatusCode); response.Setup(_ => _.Data).Returns(data); var mockIRestClient = new Mock<IRestClient>(); mockIRestClient .Setup(x => x.Execute<T>(It.IsAny<IRestRequest>())) .ReturnsAsync(response.Object); return mockIRestClient.Object; }La prueba también debe actualizarse para que sea asíncrona.
[TestMethod] public async Task GetUserByUserName() { //Arrange var client = MockRestClient<User>(HttpStatusCode.OK, "my json code"); var dataServices = new DataServices(client); //Act var user = await dataServices.GetUserByUserName("User1"); //Assert Assert.AreEqual("User1", user.Username); }No encontré ninguna gran respuesta, así que terminé escribiendo una biblioteca de ayuda. Lo publiqué en NuGet - MoqRestSharp.Helpers. Este proyecto tiene como objetivo ayudar a la prueba unitaria de RestSharp, ya que amplía Mock, por lo que me ayudó a probar mis solicitudes de RestSharp y el manejo de errores de respuesta.
utiliza moq
¡Los comentarios siempre son bienvenidos!
Solución completa
using Moq; using Newtonsoft.Json; using NUnit.Framework; using RestSharp; using System.Net; namespace RestMockTest { public class Tests { [Test] public void Test1() { var client = MockRestClient<User>(HttpStatusCode.OK, "{\"Name\":\"User1\"}"); var restRequest = new RestRequest("api/item/", Method.POST); var restResponse = client.Execute<User>(restRequest); var user = restResponse.Data; Assert.AreEqual("User1", user.Name); } public static IRestClient MockRestClient<T>(HttpStatusCode httpStatusCode, string json) where T : new() { var data = JsonConvert.DeserializeObject<T>(json); var response = new Mock<IRestResponse<T>>(); response.Setup(_ => _.StatusCode).Returns(httpStatusCode); response.Setup(_ => _.Data).Returns(data); var mockIRestClient = new Mock<IRestClient>(); mockIRestClient .Setup(x => x.Execute<T>(It.IsAny<IRestRequest>())) .Returns(response.Object); return mockIRestClient.Object; } } public class User { public string Name { get; set; } } }