【发布时间】:2018-09-18 11:48:49
【问题描述】:
我正在尝试在 Web API 控制器下进行单元测试。
[IdentityBasicAuthentication]
[Authorize]
[HttpPost]
public HttpResponseMessage GetOrderByQR([FromBody]string id)
{
try
{
var identity = HttpContext.Current.User.Identity as ClaimsIdentity;
var user = UserManager().IdentifyToken(identity);
_orderManager.CheckOrderQRFraud(id);
return Request.CreateResponse(HttpStatusCode.OK, _orderManager.GetSingleOrderWithUserPaymentAccountBy(user.UserID, id));
}
catch (BusinessException ex)
{
return CreateRawStringResponse(HttpStatusCode.NotFound, ex.Message);
}
}
但下面的测试方法在IdentifyToken() 上抛出空异常,因为没有当前用户,我明白了。
[TestMethod]
public void GetOrderByQR_Returns_OK_On_Successful_Request()
{
string orderID = "4B854B3D-397E-425F-AEAF-00F7B4110021";
var testResponse = _orderController.GetOrderByQR(orderID);
Assert.AreEqual(HttpStatusCode.OK, testResponse.StatusCode);
}
在寻找答案时,我发现解决方案在于模拟此授权属性。所以,虽然我安装了这个Moq 包,但我还是无法像刚开始单元测试一样成功地运行测试。
下面是IdentityToken()方法,如果你也需要检查一下。
public User IdentifyToken(ClaimsIdentity identity)
{
string userEmail = "";
string userPassword = "";
if (identity != null)
{
IEnumerable<Claim> claims = identity.Claims;
List<Claim> claimsArray = claims.ToList();
string[] emailArray = claimsArray[0].ToString().Split(':');
string emailValue = emailArray[2].ToString();
userEmail = emailValue.Trim();
string[] passwordArray = claimsArray[1].ToString().Split(':');
string passwordValue = passwordArray[2].ToString();
userPassword = passwordValue.Trim();
}
var user = base.GetSingleBy(x => x.Email == userEmail && x.Password == userPassword);
return user;
}
我应该如何编写我的测试方法?提前谢谢!
编辑:
Manager类实例如下。
public class OrderController : BaseController
{
OrderManager _orderManager;
public OrderController()
{
_orderManager = new OrderManager();
}
//Order Controllers
}
【问题讨论】:
-
在单独进行单元测试时,您是如何通过
HttpContext的?控制器如何安排测试?提供一个minimal reproducible example,可以更好地了解实际问题。 -
我想我无法在单元测试中通过
HttpContext,这是我的问题。另外,您在第二个问题中的意思不清楚。我在[TestClass]的顶部执行此操作:private readonly OrderController _orderController; public OrderTests() { _orderController = new OrderController { Request = new System.Net.Http.HttpRequestMessage(), Configuration = new System.Web.Http.HttpConfiguration() }; } -
这个问题缺少太多细节,我无法有效地帮助您。提供minimal reproducible example
-
显示的代码存在设计问题。
HttpContext在单元测试中将为空。我不知道用户管理器或订单管理器来自哪里......等等。没有适当的细节,就做不了什么。 -
好吧,我不是专业人士,但我不明白你为什么要求查看 ordermanager/usermanager 来自哪里。我需要伪造单元测试,就好像我使用的是经过身份验证的用户一样。人们使用模拟来解决这类问题,但我找不到离开 Moq 的方法。我编辑了我的问题以显示经理课程的来源。
标签: c# unit-testing asp.net-web-api authorization moq