如何在集成测试中传递 TempData 值以进入 .net 核心页面

How to pass TempData value in integration test to get in .net core pages

我正在使用 TempData 将值(电子邮件)从 SetPassword 页面传递到 asp.net 核心中的 SetPasswordConfirmation 页面。它按预期工作。但我无法在集成测试方法中获得此 TempData 值。

    private readonly HttpClient _client;

    public SetPasswordTest(CustomWebApplicationFactory factory)
    {
        _client = factory.CreateClient();
    }

    //Test method
    [Fact]
    public async Task POST_WithValidEmail_ShouldRedirectToHomePage()
    {   
        var httpContext = new DefaultHttpContext();
        var tempData = new TempDataDictionary(httpContext, Mock.Of<ITempDataProvider>());
        tempData["Email"] = TestData.TestUserEmail;
        var redirectLink = "~/Account/Manage";
        var setPasswordConfirmationLink = GetSetPasswordConfirmationLink();

        var response = await _client.SubmitAsync(setPasswordConfirmationLink, new
        {
            ReturnUrl = redirectLink,
            TempData = tempData
        }); 

        response.AssertOnPage(redirectLink);
        response.EnsureSuccessStatusCode();
    }

    //Page post method
    public async Task<IActionResult> OnPostAsync(string returnUrl) 
    {   
        ApplicationUser user = null;
        if(!string.IsNullOrEmpty(**Email**)) user = await _userManager.FindByEmailAsync(Email);
        //...
    }

在集成测试期间,我没有在 OnPostAsync 方法中获取电子邮件值。

这里有很多问题。首先,您不能在这样的集成测试中修改 TempData 。通常,当您测试某种持久状态时,您需要在测试中实现整个流程。例如,我假设在实际使用场景中,用户会访问上一个页面,他们首先会在该页面上提交他们的电子邮件地址。您的测试应该请求此操作,在 post 正文中传递电子邮件,就像用户 first 一样,然后请求您实际测试的此操作。

其次,TempData 无论如何都不会为此工作。对于密码重置工作流程,用户会收到一封 link 的电子邮件,他们点击后会 return 访问您的网站。 TempData 将无法生存,即使所有的星星都正确对齐并且用户立即在同一设备上单击 link,在同一浏览器中打开它。此外,用户可以在完全不同的设备上打开 link,在它交付后很久,可能在您的网站上做了其他事情之后,它变得更加损坏。

要正确实施,电子邮件地址必须包含在 link 本身中,或者用户必须在密码重置表单中重新输入。您不能以适用于所有情况的方式使用 TempDataSession 之类的东西。