[英]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.