亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嘗試使用 UrlHelper 測試控制器

嘗試使用 UrlHelper 測試控制器

C#
開心每一天1111 2022-07-23 09:18:02
嘗試創建URLHelper用于測試目的的NullReferenceException.例子:[Fact]public async void AuthenticateAsyncTest(){  // Arrange  var controller = new Controller(serviceProvider)  {    Url = new UrlHelper(new ActionContext()) // Exception thrown  };  // Act  var result = await controller.Authenticate() as ViewResult;  // Assert  Assert.NotNull(result);}每次我運行這個測試時,拋出的異常Url = new UrlHelper(new ActionContext())是:異常消息:消息:System.NullReferenceException:對象引用未設置為對象的實例。異常堆棧跟蹤:UrlHelperBase.ctor(ActionContext actionContext) ControllerUnitTest.AuthenticateAsyncTest()使用:xUnit 2.4.1、Microsoft.NETCore.App 2.2.0、Microsoft.AspNetCore.Routing.Abstractions 2.2.0要重新創建異常:創建一個空的 MVC core 2.2 解決方案創建一個 xunit 測試項目安裝 NuGet Microsoft.AspNetCore.Mvc.Core 2.2.0在測試中寫入: var Url = new UrlHelper(new ActionContext());運行測試應該是這樣的:using Microsoft.AspNetCore.Mvc;using Microsoft.AspNetCore.Mvc.Routing;using Xunit;namespace XUnitTestProject1{    public class UnitTest1    {        [Fact]        public void Test1()        {            var Url = new UrlHelper(new ActionContext());        }    }}我的問題:是否有錯誤,或者為什么這不起作用?解決方法或鏈接的文獻是否受到贊賞?
查看完整描述

2 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

根據異常消息所指的GitHub源代碼,


protected UrlHelperBase(ActionContext actionContext)

{

    if (actionContext == null)

    {

        throw new ArgumentNullException(nameof(actionContext));

    }


    ActionContext = actionContext;

    AmbientValues = actionContext.RouteData.Values;

    _routeValueDictionary = new RouteValueDictionary();

}

助手正在嘗試訪問actionContext.RouteData.Values原始示例中未提供的內容。


為測試流程完成提供必要的依賴項。


[Fact]

public async Task AuthenticateAsyncTest() {

    // Arrange

    var httpContext = new DefaultHttpContext();

    var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

    var controller = new Controller(serviceProvider) {

        Url = new UrlHelper(actionContext)

    };


    // Act

    var result = await controller.Authenticate() as ViewResult;


    // Assert

    Assert.NotNull(result);

}

還要避免使用 async void 進行單元測試。改為使用Task。


查看完整回答
反對 回復 2022-07-23
?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

第二種選擇是使用特定的構造函數。該文檔聲明它應該用于單元測試,更具體地說,當 ActionContext 只需要傳入但不被消費代碼使用時。

UrlHelper Url = new UrlHelper(new ActionContext { RouteData = new RouteData() });

感謝在 githhub 上重播的 navelDirt 和 pranavkm: https ://github.com/aspnet/AspNetCore/issues/6703


查看完整回答
反對 回復 2022-07-23
  • 2 回答
  • 0 關注
  • 160 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號