.net 测试REST API端点

ilmyapht  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(99)

我有许多REST API端点,我正在通过Apache从Web客户端调用它们,我想编写一些自动化测试,以确保它们在Web浏览器之外正常工作。
我把它们写为单元测试测试,这是我到目前为止所做的:

[TestClass]
public class ApiTests
{
    string local_host_address = "http://localhost:1234//";

    public async Task<string> Post(string path, IEnumerable<KeyValuePair<string, string>> parameters)
    {
        using (var client = new HttpClient())
        {
            client.Timeout = new TimeSpan(0,0,5);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var response_message = await client.PostAsync(local_host_address + path, new FormUrlEncodedContent(parameters));
            var response = await response_message.Content.ReadAsStringAsync();

            if (response_message.IsSuccessStatusCode)
            {
                return response;
            }
            else
            {
                throw new Exception("Request failed");
            }
        }
    }

    [TestMethod]
    [TestCategory("ApiTests")]
    public void TestLogon()
    {
        var parameters = new Dictionary<string, string>();
        parameters["email"] = "[email protected]";
        parameters["password"] = "rosebud";

        Task.Run(() =>
        {
            var output = Post("Default.aspx/Logon", parameters);
            Console.WriteLine(output.Result);
        }).Wait();
    }
}

......非常基本,它只是尝试调用特定的端点,并返回结果。问题是,这个调用返回基本的default.aspx网页主体,而不是default.aspx/logon生成的结果。我做错了一些事情,但我已经用调试器调试过了,我看不到我的错误。默认的.aspx/logon端点存在,当我通过网站访问它时,它工作得很好。我是错过了什么还是忽略了什么?

解决方案:

Bruno对我的代码片段的修改工作得很好。任何其他试图解决测试REST端点问题的人都可以将其放入单元测试并传入POCO,它将返回JSON响应。

thtygnil

thtygnil1#

您将请求体作为FormUrlEncoded发送,尽管您将请求标记为application/json。
如果你的API是REST并且采用JSON,而不是采用 Dictionary,你可以将一个对象(例如,Newtonsoft.json):

public async Task<string> Post<T>(string path, T data)
    {
        using (var client = new HttpClient())
        {
            client.Timeout = new TimeSpan(0, 0, 5);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var json = JsonConvert.SerializeObject(data);

            var response_message = await client.PostAsync(local_host_address + path, new StringContent(json, Encoding.UTF8, "application/json");

            var response = await response_message.Content.ReadAsStringAsync();

            if (response_message.IsSuccessStatusCode)
            {
                return response;
            }
            else
            {
                throw new Exception("Request failed");
            }
        }
    }

相关问题