簡體   English   中英

在dotnet核心控制器中進行單元測試非公開方法

[英]Unit testing non-public methods in dotnet core controller

假設在MVC5控制器中,我的控制器中有一個方法被控制器中的其他方法調用,但是我不希望該方法可供用戶使用。 如果我想能夠模擬它,它將看起來像這樣:

[ChildActionOnly]
public virtual string DoSpecialFormatting(string mySpecialString)
{
    // stuff
}

或者,我可能已經將[assembly: InternalsVisibleTo("MyLittleProject.Tests")][assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] (對於Moq而言)扔到AssemblyInfo.cs並將該方法標記為internal而不是public

internal virtual string DoSpecialFormatting(string mySpecialString)
{
    // stuff
}

既然現在沒有ChildActionOnly並且在新的ASP.NET Core項目中也看不到AssemblyInfo.cs文件,那么我的控制器類中將如何有Web用戶無法訪問但仍然可以被模擬的方法?

您可以將該方法提取到一個類中,即名為SpecialFormatter,然后通過DI注入到控制器中。 要測試您的控制器,您可以模擬此類。

class SpecialFormatter
{ 
   public string DoSpecialFormatting(string mySpecialString)
   {
       // stuff
   }
}

然后在您的控制器中

class SomeController : Controller
{

   private SpecialFormatter _formatter;

   public SomeController(SpecialFormatter formatter)
   {
      _formatter = formatter;
   }

   public ActionResult SomeAction(string input)
   {
      string output = _formatter.DoSpecialFormatting(input);
      // stuff
   }

}

在ASP.NET Core中,該屬性稱為NonActionAttribute

[NonAction]
public virtual string DoSpecialFormatting(string mySpecialString)
{
    // stuff
}

恕我直言,它比內部更好。

暫無
暫無

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

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