gpt4 book ai didi

testing - 如何集成测试 Controller ,在该 Controller 内部,方法从另一个站点获取 token

转载 作者:行者123 更新时间:2023-11-28 20:07:30 25 4
gpt4 key购买 nike

我正在设置一个 API,它通过 JWT 向另一台服务器进行身份验证。我要测试的 Controller 方法之一是从外部站点获取 token 。如何测试此方法?

我制作了一个测试服务器并试图模仿提供 token 的网站操作。我可以通过测试方法访问此测试服务器,但我无法从实际 Controller 访问它。

这是我的测试服务器设置方法MockedController 是应该提供 token 的 Controller 并且工作正常,我可以从测试单元获取 token 。AuthController 是应该测试的 Controller 。

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;
}

额外信息。模拟 Controller 的测试方法工作正常。看来问题出在模拟 Controller 的第二步使用中。第一步工作正常。我的意思是我可以在第一步从测试单元访问模拟 Controller ,但是当我尝试通过主 Controller (AuthController)访问它时,我无法访问它

最佳答案

您的代码与实现问题的耦合过于紧密,无法模拟组件以将其与第 3 方依赖项隔离开来。因为 HttpClient 是手动创建的,所以无法替换其处理程序来伪造请求。

考虑模拟注入(inject)到被测 Controller 中的身份验证服务本身。

For example

//...

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

config.AddSingleton<IAuthService>(authService);

//...

关于testing - 如何集成测试 Controller ,在该 Controller 内部,方法从另一个站点获取 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56776990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com