我需要一些帮助来为我的 API 测试编写自定义断言方法
I need some help writing custom Assertion methods for my API testing
所以我正在做的两个断言是检查应该给我的状态消息 "OK"
我正在检查 API returns 200。但我的问题是每个请求当然和那个响应变量不同。我试图避免编写相同的三行断言,而只调用一个简单的静态方法
HttpWebResponse response = (HttpWebResponse)sd.GetDataType();
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
statusNumber = (int)response.StatusCode;
Assert.AreEqual(200, statusNumber);
所有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()
会抛出异常
HTTP 协议仅发送以下字节:“200 OK”
您的代码正在做两件事:
断言请求的响应是“200 OK”。
断言 library 代码正在运行,因为 StatusCode 枚举获得了正确的值。
您可能想避免这样做,我们希望 MS 能满足您的要求,(以及执行此操作的 LOC)
为避免重复该代码,制作一个方法并使用它,您可以尝试:
- 一个抽象的方法 "BaseTestClass" 你 inherit 来自
- 一个 Extension Method 用于 HttpWebResponse
- static method 在某种实用程序上 class。
- 只是同一个 class 上的私有方法。
我会采用第一种方法,但如果您是编程新手,则可以开始尝试最后一种方法,它可能更容易理解。
编辑
稍微看了一下 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;
}
在你的 class
namespace
used
中的 static class
上使用此方法,你可以使用:
Assert.IsTrue(response.IsOk());
这段代码是直接写在这里的,它可能无法按原样运行,但我希望你能理解。
我会做一个助手class来测试它:
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..
所以我正在做的两个断言是检查应该给我的状态消息 "OK" 我正在检查 API returns 200。但我的问题是每个请求当然和那个响应变量不同。我试图避免编写相同的三行断言,而只调用一个简单的静态方法
HttpWebResponse response = (HttpWebResponse)sd.GetDataType();
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
statusNumber = (int)response.StatusCode;
Assert.AreEqual(200, statusNumber);
所有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()
会抛出异常
HTTP 协议仅发送以下字节:“200 OK”
您的代码正在做两件事:
断言请求的响应是“200 OK”。
断言 library 代码正在运行,因为 StatusCode 枚举获得了正确的值。
您可能想避免这样做,我们希望 MS 能满足您的要求,(以及执行此操作的 LOC)
为避免重复该代码,制作一个方法并使用它,您可以尝试:
- 一个抽象的方法 "BaseTestClass" 你 inherit 来自
- 一个 Extension Method 用于 HttpWebResponse
- static method 在某种实用程序上 class。
- 只是同一个 class 上的私有方法。
我会采用第一种方法,但如果您是编程新手,则可以开始尝试最后一种方法,它可能更容易理解。
编辑
稍微看了一下 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;
}
在你的 class
namespace
used
中的 static class
上使用此方法,你可以使用:
Assert.IsTrue(response.IsOk());
这段代码是直接写在这里的,它可能无法按原样运行,但我希望你能理解。
我会做一个助手class来测试它:
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..