【问题标题】:I need some help writing custom Assertion methods for my API testing我需要一些帮助来为我的 API 测试编写自定义断言方法
【发布时间】:2020-05-28 11:48:57
【问题描述】:

所以我正在做的两个断言是检查应该给我“OK”的状态消息 我正在检查 API 是否返回 200。但我的问题是每个请求当然是不同的,并且响应变量是不同的。我试图避免编写相同的三行断言,而只调用一个简单的静态方法

HttpWebResponse response = (HttpWebResponse)sd.GetDataType();
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
statusNumber = (int)response.StatusCode;
Assert.AreEqual(200, statusNumber);

【问题讨论】:

  • 我试图不在断言方法中使用函数方法“sd.GetDataType()”,因为它们是不同的。我将不得不创建其中的许多

标签: c# rest api assertion


【解决方案1】:

我会创建一个辅助类来测试它:

public static class HttpWebResponseDebug
{
    public static void Assert(HttpWebResponse response)
    {
        Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        statusNumber = (int)response.StatusCode;
        Assert.AreEqual(200, statusNumber);        
    }
}

var response = (HttpWebResponse)sd.GetDataType();
HttpWebResponseDebug.Assert(response);
// do your thing..

【讨论】:

  • 帮助类闻起来很臭 stackoverflow.com/a/2446499/1927444
  • 当然,我也不喜欢大量的辅助类。我可能根本不会使用 Assert。不必要的例外情况变得更糟了..
  • 我希望 OP 正在尝试做某种 e2e 测试代码。
  • @PabloRecalde 确实,它在标题中;-)
  • @PabloRecalde 是的,正在做 e2e 测试
【解决方案2】:

所有的assert方法都是静态的,所以你可以创建自己的静态方法并在里面使用Assert

public static class AssertExtensions
{
    public static void Assert(YourType sd)
    {
        HttpWebResponse response = (HttpWebResponse)sd.GetDataType();
        Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        statusNumber = (int)response.StatusCode;
        Assert.AreEqual(200, statusNumber);
    }
}

然后使用AssertExtensions.Assert(response)

顺便说一句,如果您使用的是 .Net Core,那么已经有方法 response.EnsureSuccessStatusCode() 会引发异常

【讨论】:

    【解决方案3】:

    HTTP 协议只发送以下字节:“200 OK”

    您的代码正在做两件事:

    • 断言请求的响应是“200 OK”。

    • 断言 库 代码正在工作,因为 StatusCode 枚举获得了正确的值。

    您可能希望避免这样做,我们希望 MS 能够覆盖您,(以及这样做的 LOC)

    为避免重复该代码,请创建一个方法并使用它,您可以尝试:

    我会采用第一种方法,但如果您是编程新手,您可以开始尝试最后一种可能更容易理解的方法。

    编辑

    看了HttpResponseMessage reference 之后,我会使用IsSuccessStatusCode 属性:

    Assert.IsTrue(response.IsSuccessStatusCode)
    

    就是这样。但这会检查响应是否在成功范围内(200-299),所以也许你需要额外检查代码,那么最初建议的方法之一可能会派上用场。

    说话很便宜,给我看看代码:

    public static bool IsOk(this HttpWebResponse response) {
        var isOk = response.IsSuccessStatusCode;
        isOk = isOk && response.StatusCode == 200;
        return isOk;
    }
    

    在namespace used 通过class 使用此方法,您可以使用:

    Assert.IsTrue(response.IsOk());
    

    这段代码是直接写在这里的,它可能无法按原样工作,但我希望你能明白。

    【讨论】:

    • 我是 C# 新手,我可以使用 extends 方法来继承吗?
    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多