簡體   English   中英

用於單元測試的Mock HttpActionContext

[英]Mock HttpActionContext for Unit Test

我有一個自定義授權屬性如下所示,我正在嘗試編寫單元測試來測試其功能。

    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        if (actionContext.Request.Headers.Authorization != null)
        {
            // get the Authorization header value from the request and base64 decode it
            string userInfo = Encoding.Default.GetString(Convert.FromBase64String(actionContext.Request.Headers.Authorization.Parameter));

            // custom authentication logic
            if (string.Equals(userInfo, string.Format("{0}:{1}", "user", "pass")))
            {
                IsAuthorized(actionContext);
            }
            else
            {
                HandleUnauthorizedRequest(actionContext);
            }
        }
        else
        {
            HandleUnauthorizedRequest(actionContext);
        }
    }

    protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized)
        {
            ReasonPhrase = "Unauthorized"
        };
    }

我的問題是,當我嘗試測試時,我得到“System.NullReferenceException:對象引用沒有設置為對象的實例。” 我試圖設置actionContext的request.headers.authorization值,但它沒有setter。 當我嘗試模擬HttpActionContext時,它說它無法從模擬HttpActionContext轉換為真實的HttpActionContext。 下面是我的測試代碼

public class HttpBasicAuthorizeAttributeTest
{
    private HttpBasicAuthorizeAttribute ClassUnderTest { get; set; }

    private HttpActionContext actionContext { get; set; }

    [TestMethod]
    public void HttpBasicAuthorizeAttribute_OnAuthorize_WithAuthorizedUser_ReturnsAuthorization()
    {
       var context = new Mock<HttpActionContext>();
       context.Setup(x => x.Request.Headers.Authorization.Parameter).Returns("bzUwkDal=");
       ClassUnderTest.OnAuthorization(context);
    }

    [TestInitialize]
    public void Initialize()
    {
        ClassUnderTest = new HttpBasicAuthorizeAttribute();
        actionContext = new HttpActionContext();
    }
}

*省略斷言,直到我甚至可以讓HttpActionContext工作

您可以使用實際對象並將其提供給模擬,以便將測試中的方法作為Moq運行,無法模擬非虛擬成員。

[TestMethod]
public void HttpBasicAuthorizeAttribute_OnAuthorize_WithAuthorizedUser_ReturnsAuthorization() {
   //Arrange
    var context = new HttpActionContext();
    var headerValue = new AuthenticationHeaderValue("Basic", "bzUwkDal=");
    var request = new HttpRequestMessage();
    request.Headers.Authorization = headerValue;
    var controllerContext = new HttpControllerContext();
    controllerContext.Request = request;
    context.ControllerContext = controllerContext;

   //Act
   ClassUnderTest.OnAuthorization(context);

   //Assert
   //...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM