【发布时间】:2021-12-23 20:27:06
【问题描述】:
我正在尝试编写一个集成测试来测试我的应用程序的注册功能。这是控制器:
[Route("account")]
public class IdentityController : MainController
{
// ...
[HttpGet("signup")]
public IActionResult SignUp()
{
return View();
}
[HttpPost("signup")]
public async Task<IActionResult> SignUp(UserSignUpViewModel signUp)
{
if (!ModelState.IsValid)
{
我正在参加在线培训,根据视频以及周围的其他示例,这就是应该如何测试表单提交:
[Fact]
public async Task Identity_CreateUser_ShouldBeSuccessful()
{
// Arrange
var initialResponse = await _fixture.Client.GetAsync("/account/signup");
initialResponse.EnsureSuccessStatusCode();
var antiForgeryToken = _fixture.GetAntiForgeryToken(await initialResponse.Content.ReadAsStringAsync());
var postRequest = new HttpRequestMessage(HttpMethod.Post, "/account/signup")
{
Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
{ "Name", "John Malone Doe" },
// ...
}
}
// Act
var response = await _fixture.Client.SendAsync(postRequest);
// ...
Rider 甚至会为我自动完成路径,但它会失败并显示一条消息:
System.InvalidOperationException:提供了无效的请求 URI。请求 URI 必须是绝对 URI,或者必须设置 BaseAddress。
我尝试传递完整地址“https://localhost:5001/account/signup”,并以这种方式编写代码:
var postRequest = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://localhost:5001/account/signup"),
Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
没有解决。
【问题讨论】:
-
你确定有一个服务器在 https localhost:5001 监听吗?您可以尝试在浏览器中打开此网址查看
-
这可能是因为您使用的是 HTTPS 协议。本地主机通常在 HTTP 上运行。而不是
"https://localhost:5001/account/signup",尝试"http://localhost:5001/account/signup"(HTTP 后没有's')。 -
@Renat,是的,我是。我启动了服务器并手动测试了所有内容。
-
@BrendanR,你看,
initialResponse代码工作正常,它具有与问题顶部相同的端点。另外,如果我为HttpRequestMessage输入一个不存在的端点,测试将失败,说它没有找到。我相信这是另外一回事,但让我尝试在此处调整它以仅使用 HTTP。 -
@BrendanR.,它仍然存在!
标签: c# integration-testing .net-5