C# 如何编写asp.net web api的集成测试

C# 如何编写asp.net web api的集成测试,c#,authentication,asp.net-web-api,integration-testing,C#,Authentication,Asp.net Web Api,Integration Testing,我正忙着用asp.NETWebAPI设计一个web服务。我想开始对每个控制器进行单元测试 以下是我目前的测试课程: [TestClass] public class MyDevicesControllerTest { [TestMethod] public void TestValidUser() { MyDeviceController controller = new MyDeviceController(); var

我正忙着用asp.NETWebAPI设计一个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();
    }
}
但是我的web服务使用令牌身份验证。因此,我想知道如何模拟身份验证过程

所以我在想,我不可能让用户使用Http请求来测试它?Ie不是测试控制器,而是发出http请求并检查其答案


测试它的更简单/更好的方法是什么?

在ASP.NET Web API中,身份验证在调用控制器之前在管道中进行,因此您需要为此编写一些集成测试。我在上的在线课程中向您介绍了如何做到这一点,但要点如下:

下面是一个针对使用内存中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);
    }
}
如您所见,它向请求的HTTP头添加了一个“承载”令牌。
SimpleWebToken
类只是我为这个场合编写的一个自定义类,但是您可以用一个更好的类来替换它,该类可以创建正确的身份验证令牌

如果您喜欢不同的身份验证方案(如Basic或Digest),则可以