【问题标题】:Integration tests result keeps returning status code 301集成测试结果不断返回状态码 301
【发布时间】:2019-07-08 06:26:24
【问题描述】:

我正在尝试对项目进行集成测试,但同样的错误不断出现。用邮递员手动做同样的事情效果很好。

我已尝试更改端口号并打开/关闭 SSL,但仍然出现相同的问题。

用户API测试:

[TestClass]
    public class UserAPITest
    {
        private readonly HttpClient _client;
        private readonly IConfiguration _configuration;

        public UserAPITest()
        {
            _client = TestsHelper.Client;
            _configuration = TestsHelper.Configurations;
        }

        [TestInitialize]
        public void TestInitialize()
        {
        }

        [TestMethod]
        [DataRow(nameof(HttpMethod.Post), "api/User/refreshToken")]
        public async Task Initiation_Authorized_ShouldReturnNewToken(string httpMethod, string url)
        {
            _client.DefaultRequestHeaders.Authorization = TestsHelper.GetTestUserBearerHeader();
            var request = new HttpRequestMessage(new HttpMethod(httpMethod), url);

            var response = await _client.SendAsync(request);

            Assert.IsNotNull(response.Content); // value during debug added below

            Assert.AreEqual(HttpStatusCode.OK,response.StatusCode); // test fails here

// check for token inside response
            // Assert.IsTrue(Regex.IsMatch(response.RequestMessage.Content.ToString(), "^[A-Za-z0-9-_=]+\\.[A-Za-z0-9-_=]+\\.?[A-Za-z0-9-_.+/=]*$"));
        }
    }

TestsHelper:


        private static HttpClient SetClient()
        {
            HttpClient client;
            var host = new WebHostBuilder()
                                    .UseEnvironment("Development")
                                    .UseStartup<Startup>()
                                    ;

            var server = new TestServer(host);

            client = new HttpClient {BaseAddress = new Uri(Configurations["Tests:ApiClientUrl"], UriKind.RelativeOrAbsolute)};

            return client;
        }

        public static string GetTestUserToken()
        {
            var token = "someToken"; // there is an actual token here but I have removed it

            return token;
        }
        public static AuthenticationHeaderValue GetTestUserBearerHeader()
        {
            var token = GetTestUserToken();
            var bearerToken = new AuthenticationHeaderValue("Bearer", token);

            return bearerToken;
        }

预期结果:测试通过(返回令牌)或失败(返回 401 未授权)

实际结果:测试返回 301 源已被移动

响应值:

{StatusCode: 301, ReasonPhrase: 'Moved Permanently', Version: 1.1, Content: System.Net.Http.HttpConnection+HttpConnectionResponseContent, Headers:
{
  Cache-Control: no-cache
  Pragma: no-cache
  Proxy-Connection: close
  Connection: close
  Content-Type: text/html; charset=utf-8
  Content-Length: 668
}}

【问题讨论】:

    标签: c# api asp.net-core integration-testing asp.net-core-webapi


    【解决方案1】:

    你需要将你的测试用例修改为

    _client.DefaultRequestHeaders.Authorization = TestsHelper.GetTestUserBearerHeader();
    var request = new HttpRequestMessage(new HttpMethod(httpMethod), url);
    
    var response = await _client.SendAsync(request);
    var content = await response.Content.ReadAsStringAsync();
    
    Assert.IsNotNull(content);
    
    Assert.AreEqual(HttpStatusCode.OK,response.StatusCode);
    

    更新 问题出在 TestServer 和 Client 上

    var server = new TestServer(Program.CreateWebHostBuilder(new string[] { }));
    client = server.CreateClient();
    client.BaseAddress = new Uri(Configurations["Tests:ApiClientUrl"]);
    

    【讨论】:

    • 我试了一下,可惜没成功。感谢您的尝试
    • 听起来很蠢,但是你能把“api/User/refreshToken”改成“/api/User/refreshToken”吗?
    • 据我所知,如果你一开始没有加'/',会在HttpRequestMessage中处理。但为了尝试,我做了,没有任何改变。
    • 我明白了,还有一个建议,我感觉 webHostBuild 或客户端配置不正确,最后一个建议,将初始化替换为: server = new TestServer(Program.CreateWebHostBuilder(new string[] {} ));客户端 = server.CreateClient();
    【解决方案2】:

    在构建测试 http 客户端时使用: server.CreateClient() 而不是 client = new HttpClient {BaseAddress = new Uri(Configurations["Tests:ApiClientUrl"], UriKind.RelativeOrAbsolute)};

    您正在做的事情不起作用,因为您正在构建的测试服务器实际上并未在 http 级别公开端点。您使用测试服务器和测试客户端来测试您的 webapi/http 集成,同时测试基础设施会短路内存中的整个 http 协议栈。

    https://andrewchaa.me.uk/programming/2019/03/01/unit-testing-with-ASP-NET-Core.html

    【讨论】:

    • 这引发了错误the constraint reference 'langCon' could not be resolved to a type. Register the constraint type with 'Microsoft.AspNetCore.Routing.Route Options.Constraint Map'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多