我正忙着用 asp.net web api 设计一个 web 服务。我想开始对每个控制器进行单元测试。
到目前为止,这是我的测试课:
[TestClass]
public class MyDevicesControllerTest
{
[TestMethod]
public void TestValidUser()
{
MyDeviceController controller = new MyDeviceController();
var result = controller.Get();
}
[TestMethod]
public void TestInvalidUser()
{
MyDeviceController controller = new MyDeviceController();
var result = controller.Get();
}
}
但我的网络服务使用令牌身份验证。所以我需要如何模拟身份验证过程。
所以我在想我可能不会让用户使用 Http 请求来测试它吗?即,我不测试控制器,而是发出一个 http 请求并检查其答案?
测试它的更简单/更好的方法是什么?
在 ASP.NET Web API 中,身份验证在调用控制器之前在管道中发生,因此您需要为此编写一些集成测试。我将在我的在线课程中向您介绍如何做到这一点由外而内的 TDD http://bit.ly/outside-in-tdd,但要点如下:
这是针对资源的集成测试,使用内存中的 HTTP要求。本次测试不使用网络:
[Fact]
public void GetReturnsResponseWithCorrectStatusCode()
{
var baseAddress = new Uri("http://localhost:8765");
var config = new HttpSelfHostConfiguration(baseAddress);
config.Routes.MapHttpRoute(
name: "API Default",
routeTemplate: "{controller}/{id}",
defaults: new
{
controller = "Home",
id = RouteParameter.Optional
});
var server = new HttpSelfHostServer(config);
using (var client = new HttpClient(server))
{
client.BaseAddress = baseAddress;
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Bearer",
new SimpleWebToken(new Claim("userName", "foo")).ToString());
var response = client.GetAsync("").Result;
Assert.True(
response.IsSuccessStatusCode,
"Actual status code: " + response.StatusCode);
}
}
如您所见,它将“Bearer”令牌添加到请求的 HTTP 标头中。这SimpleWebToken
class 只是我为此场合编写的自定义类,但您可以将其替换为更好的类来创建正确的身份验证令牌。
如果您更喜欢不同的身份验证方案(例如基本或摘要),您可以相应地设置授权标头 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.8.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)