如何在单元测试中模拟 RestSharp 便携式库 [英] How to mock RestSharp portable library in Unit Test

查看:37
本文介绍了如何在单元测试中模拟 RestSharp 便携式库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想模拟 RestClient 类以进行测试

公共类数据服务:IDataServices{私有只读 IRestClient _restClient;公共数据服务(IRestClient restClient){_restClient = 休息客户端;}公共异步任务<用户>GetUserByUserName(字符串用户名){用户 user = null;//创建一个新的请求var restRequest = new RestRequest("User", Method.GET);//创建 REST 参数restRequest.AddParameter("userName", userName, ParameterType.QueryString);//执行 REST 请求var restResponse = await _restClient.Execute<用户>(restRequest);如果(restResponse.StatusCode.Equals(HttpStatusCode.OK)){用户 = restResponse.Data;}返回用户;}}

我的测试班:

[测试类]公共类数据服务测试{公共静态 IRestClient MockRestClient(HttpStatusCode httpStatusCode,字符串 json){var mockIRestClient = new Mock();mockIRestClient.Setup(x => x.Execute(It.IsAny())).Returns(new RestResponse<T>{数据 = JsonConvert.DeserializeObject(json),状态码 = httpStatusCode});返回 mockIRestClient.Object;}[测试方法]public async void GetUserByUserName(){var dataServices = new DataServices(MockRestClient(HttpStatusCode.OK, "my json code"));var user = await dataServices.GetUserByUserName("User1");Assert.AreEqual("User1", user.Username);}}

但我无法实例化 RestResponse 对象,出现以下错误:

.Returns(new RestResponse<T>{数据 = JsonConvert.DeserializeObject(json),状态码 = httpStatusCode});

<块引用>

无法在此处访问受保护的内部构造函数RestResponse".

我该如何解决这个问题?我在 Xamarin 便携式库上使用 FubarCoder.RestSharp nuget 包.

解决方案

Mock IRestResponse 并返回

public static IRestClient MockRestClient(HttpStatusCode httpStatusCode, string json)其中 T :新(){var data = JsonConvert.DeserializeObject(json)var response = new Mock>();response.Setup(_ => _.StatusCode).Returns(httpStatusCode);response.Setup(_ => _.Data).Returns(data);var mockIRestClient = new Mock();模拟IrestClient.Setup(x => x.Execute(It.IsAny())).ReturnsAsync(response.Object);返回 mockIRestClient.Object;}

测试也应该更新为异步

[测试方法]公共异步任务 GetUserByUserName() {//安排var client = MockRestClient(HttpStatusCode.OK, "我的 json 代码");var dataServices = new DataServices(client);//行为var user = await dataServices.GetUserByUserName("User1");//断言Assert.AreEqual("User1", user.Username);}

I would like to mockup the RestClient class for test purposes

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 :

[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 instantiate 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.

解决方案

Mock IRestResponse<T> and return that

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;
}

The test should also be updated to be async as well

[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);
}

这篇关于如何在单元测试中模拟 RestSharp 便携式库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆