servicestack - 如何测试具有重定向的端点?
问题描述
我有以下用于确认电子邮件地址的端点:
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
是空的,所以它抛出异常。
测试包含重定向的服务的正确方法是什么?
解决方案
如果重定向是针对浏览器的,那么您的测试应该通过请求 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(...));
});
推荐阅读
- ios - Swift:无法在 SplitViewController 中调整 collectionViewCells 的大小
- mongodb - 如何从 Mongodb 聚合新文档
- css - CSS Bug:Mat-Table 中的列是粘性的,但是当我滚动时不显示border-right
- c# - 从 C# 应用程序调用 c++ DLL
- android - 即使文件存在,Android/Kotlin 中的 java.lang.FileNotFoundException
- linux - 为什么我必须更改 postfix 的 linux 主机名?
- azure - OAuth 2.0 SAML 不记名断言流程
- javascript - 订阅外的角度访问数据
- opencart - Opencart 检查当前页面是否为产品
- javascript - 如何在 react-slick 中将类添加到 li 标签