Модульное тестирование удаленных вызовов API, как оно работает с объектами JSON - PullRequest
0 голосов
/ 18 февраля 2019

В моем веб-интерфейсе API у меня есть метод, который вызывает сервис, который возвращает десериализованный объект JSON.Я не могу найти способ для модульного тестирования, который работает для меня.ниже приведен код контроллера:

     [RequireHttps]
     [Route("api/GetItem/{id}")]
     public class GetItemController : ControllerBase
    {
     private static HttpClient client = new HttpClient();
     private Item item = new Item();

     [RequireHttps]
     [Route("api/GetItem/{id}")]
     public Item GetItem(string name, string password)
     {
        string url = "https://localhost:5001/";


       string uri = url + "api/item/" + name+ "/" +  password "/"  ;
       client.DefaultRequestHeaders.Accept.Add(new 
       MediaTypeWithQualityHeaderValue("application/json"));
       HttpResponseMessage Res = client.GetAsync(uri).Result;              

            if (Res.IsSuccessStatusCode)
            {

                var MemResponse = Res.Content.ReadAsStringAsync().Result;

                member = JsonConvert.DeserializeObject<Item> 
                (MemResponse);

            }

            return Ok(item);
        }
    }

В написанном мной модульном тесте предполагается проверка неправильного имени пользователя и пароля, но при запуске теста он просто выделяется серым цветом и никогда не запускается

  [TestMethod]
   public void GetItemWithWrongPassword()
   {      
    var username = "Hellow";
    var pass = "There";
    var controller = new GetItemController();
    var response = controller.GetItem(username, pass);
    var s = response.ToString();
    Assert.AreEqual(s, "System.Web.Http.Results.NotFoundResult");
}

что я делаю не так?Позже я хочу проверить соединение с удаленным API.

1 Ответ

0 голосов
/ 21 февраля 2019

Создание экземпляра GetItemController и вызов его методов не очень хорошая идея, потому что весь процесс сообщения пропускается в процессе.

Здесь я вижу два варианта:

  1. Поместите код (включая HttpClient), содержащийся в GetItem, в другой класс и вызовите метод для экземпляра этого класса, например:

    public class ItemClient
    {
        private static HttpClient client = new HttpClient();            
    
        public Item GetItem(string name, string password)
        {
            Item item = null;
            string url = "https://localhost:5001/";
            string uri = url + "api/item/" + name + "/" + password;
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            HttpResponseMessage Res = client.GetAsync(uri).Result;              
    
            if (Res.IsSuccessStatusCode)
            {
                var MemResponse = Res.Content.ReadAsStringAsync().Result;
                item = JsonConvert.DeserializeObject<Item>(MemResponse);
            }
            return item;
        }
    }
    

    Метод контроллера:

    [RequireHttps]
    [Route("api/GetItem/{name}/{password}")]
    public Item GetItem(string name, string password)
    {
        ItemClient client = new ItemClient();
        var item = client.GetItem(name, password);
        return Ok(item);
    }
    

    Метод испытания:

    [TestMethod]
    public void GetItemWithWrongPassword()
    {      
        var username = "Hellow";
        var password = "There";
        ItemClient client = new ItemClient();
        var item = client.GetItem(username, password);
        Assert.IsNull(item);
    }
    
  2. Вызов метода контроллера с использованием HttpClient в методе испытания:

    [TestMethod]
    public void GetItemWithWrongPassword()
    {      
        var username = "Hellow";
        var password = "There";
    
        string url = "https://localhost/"; // Host of your Web API
    
        string uri = url + "api/GetItemController/GetItem/" + username + "/" + password;
        HttpClient client = new HttpClient(); 
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        HttpResponseMessage Res = client.GetAsync(uri).Result;              
        var s = Res.ToString();
        Assert.AreEqual(s, "System.Web.Http.Results.NotFoundResult");
    }
    

Я лично предпочитаю вариант 1 из-за двух преимуществ:

  1. Отладка теста проще.Отладка вызова с помощью HttpClient (вариант 2) обычно означает, что вам нужно запустить второй экземпляр Visual Studio и установить там точку останова.

  2. Код можно использовать в других проектахэто не сервисы Web API.Конечные точки становятся простыми обертками вокруг реальной бизнес-логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...