单元测试dotnet核心控制器中的非公共方法

时间:2016-12-16 17:16:40

标签: c# unit-testing asp.net-core

假设在一个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核心项目中看不到AssemblyInfo.cs文件,我的控制器类中的方法怎么会让网络用户无法访问访问,但仍然可以嘲笑?

2 个答案:

答案 0 :(得分:1)

您可以将该方法提取到类,即名为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
   }

}

答案 1 :(得分:1)

在ASP.NET Core中,该属性称为NonActionAttribute

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

Imho比内部更好。