首页 > 解决方案 > 如何测试具有重定向的端点?

问题描述

我有以下用于确认电子邮件地址的端点:

public ConfirmEmailResponse Get(ConfirmEmail req)
{
    var cacheItem = Cache.Get<ConfirmEmailCacheItem>(req.Token);
    if (cacheItem == null)
    {
        base.Response.AddHeader("Location", $"/mail-confirm??confirmed=false");
        base.Response.StatusCode = 302;
        return ConfirmEmailResponse.GetExpiredResponse();
    }

    var domain = _settings.GetRequiredString("site:frontend");

    var user = (IUserAuth)Db.LoadSingleById<UserAuthCustom>(cacheItem.UserId);

    user.UpdateToVerified(_authRepository);

    Cache.Remove(req.Token);
    Cache.Remove($"email-confirm:{user.Id}");

    base.Response.AddHeader("Location", $"/mail-confirm?confirmed=true");
    base.Response.StatusCode = 302;

    return new ConfirmEmailResponse
    {
        Success = true,
        PublicMessage = "Email has been confirmed"
    };
}

我正在尝试为此过程编写测试,但重定向导致我为测试而构建的 AppHost 出现问题。

如果我试试这个:

var client = CreateClient();

var email = (EmailSenderMock)AppHost.Resolve<IEmailSender>();
var token = email.EmailMessages.First().ContentValues["token"];

var confirm = new ConfirmEmail{ Token = token };

var confirmResponse = client.Get(confirm);

然后 SS 生成“未找到”异常。我必须删除标题和状态代码才能获得响应。

我尝试在没有客户端的情况下直接测试服务,如下所示:

var email = (EmailSenderMock)AppHost.Resolve<IEmailSender>();
var confirmService = AppHost.Resolve<UserEmailServices>();
var token = email.EmailMessages.First().ContentValues["token"];

var confirm = new ConfirmEmail{ Token = token };

confirmResponse = confirmService.Get(confirm)

但是现在base.Request是空的,所以它抛出异常。

测试包含重定向的服务的正确方法是什么?

标签: servicestack

解决方案


如果重定向是针对浏览器的,那么您的测试应该通过请求 HTML 响应来模拟一个。

由于这不是一个正常的服务客户端请求,您应该使用一个通用的 HTTP 客户端,例如HTTP Utils,例如:

var url = baseUrl.CombineWith(new ConfirmEmail { Token = token }.ToGetUrl());
var body = url.GetStringFromUrl(accept: MimeTypes.Html,
    requestFilter: req => req.AllowAutoRedirect = false,
    responseFilter: res =>
    {
        Assert.That(res.StatusCode, Is.EqualTo(HttpStatusCode.Redirect));
        Assert.That(res.Headers[HttpHeaders.Location],
            Is.EqualTo(...));
    });

推荐阅读