繁体   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