假设在一个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
文件,我的控制器类中的方法怎么会让网络用户无法访问访问,但仍然可以嘲笑?
答案 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比内部更好。