2017-03-07 59 views
2

我想模型的处理RESTClient实现类用于测试目的如何嘲笑RestSharp移植库在单元测试

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

} 

我的测试类:

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

但我不能实例化对象RestResponse ,我有以下错误:

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

Cannot access protected internal constructor 'RestResponse' here.

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

+0

模拟'IRestResponse '并返回 – Nkosi

回答

3

模拟IRestResponse<T>并返回

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

测试也应更新为异步以及

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

@Nkosi我试图用你的方法并且我得到以下错误:'T'必须是具有公共无参数构造函数的非抽象类型,才能将其用作通用类型或方法'RestClient.Execute (RestRequest)'中的参数'T'。你有一个想法,为什么我得到这个? – alminh

+0

@alminh正如错误信息所解释的那样,很可能你正在使用一种抽象的类型。 – Nkosi

+1

感谢您的回复。我需要在MockRestClient方法的T:new()处添加约束。现在它工作正常。 – alminh