如何集成测试控制器,该控制器在该控制器内部,方法从另一个站点获得令牌



我正在设置一个API,通过JWT将其身份验证到另一台服务器。我要测试的控制器的一种方法,从外部站点获取令牌。如何测试此方法?

我制作了一台测试服务器,并尝试模仿提供令牌的网站操作。我可以通过测试方法访问此Test Server,但我无法从实际的控制器中获取。

这是我的测试服务器设置方法 MockedController是应该提供TOKE并且工作正常的控制器,我可以从测试单元获得令牌。 AuthController是应该测试的控制器。

var server = new TestServer(
                new WebHostBuilder()
                .UseEnvironment(TestConstants.EnvironmentName)
                .UseStartup<Startup>()
                .UseUrls(TestConstants.MockAddress)
                .ConfigureTestServices(config =>
                {
                    config.AddOptions();
                    config.AddMvc()
                       .SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_2_2)
                        .AddApplicationPart(typeof(AuthController).Assembly)
                        .AddApplicationPart(typeof(MockedTokenController).Assembly)
                        ;
                    config.AddSingleton<MockedTokenController>();
                    config.BuildServiceProvider();
                }));
            server.BaseAddress = new Uri(TestConstants.MockAddress);
            server.CreateHandler();
            _client = server.CreateClient();
            _client.BaseAddress = new Uri(TestConstants.MockAddress);// I tried with and without this line

这是失败的测试方法

 var request = new HttpRequestMessage(HttpMethod.Get, "/Auth/Login");
            var response = await _client.SendAsync(request);
            var contents = await response.Content.ReadAsStringAsync();
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);

这是authcontroller登录方法代码

[HttpGet("Login")]
public async Task<IActionResult> LoginAsync(){
         var token = await _authService.GetAuthenticationTokenAsync();
         return Ok(token);
}

这是从 AuthController

调用的authservice代码
public async Task<string> GetAuthenticationTokenAsync(){
      HttpClient client = new HttpClient();
       var response = await client.SendAsync(request, 
       HttpCompletionOption.ResponseContentRead);
       response.EnsureSuccessStatusCode();
       var token = await response.Content.ReadAsStringAsync();
       return token;
}

额外的信息。模拟控制器的测试方法正常工作。似乎问题在模拟控制器的第二步使用中。第一步效果很好。我的意思是,我可以在第一步访问测试单元的模拟控制器,但是当我尝试通过主控制器(AuthController(访问它时,我无法

您的代码与实现问题相结合,以至于允许模拟组件以将其与第三方依赖关系隔离。由于HttpClient是手动创建的,因此无法替换其处理程序来伪造请求。

考虑嘲弄被注入正在测试的控制器的验证服务本身。

For example
//...
var token = "{fake token here}";
var authService = Mock.Of<IAuthService>(_ =>
    _.GetAuthenticationTokenAsync == Task.FromResult(token)
);
config.AddSingleton<IAuthService>(authService);
//...

相关内容

最新更新