2016-12-16 37 views
0

假設在MVC5控制器中,我的控制器中有一個方法被控制器中的其他方法調用,但我不希望它可供用戶使用。如果我希望能夠嘲笑它,它應該是這樣的:單元測試dotnet核心控制器中的非公開方法

[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用戶無法訪問但仍然可以被模擬的方法?

+0

您可以做的一種方式是,將所有內部邏輯放在共享框架項目中,然後使用InternalsVisibleTo作爲您的測試項目。 – Prashant

回答

1

在ASP.NET核心的屬性稱爲NonActionAttribute

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

Imho它比內部更好。

+0

謝謝,這正是我正在尋找的。我希望能夠在不提取到其他類的情況下執行此操作,尤其是對於大量使用服務器狀態的方法。 – Micteu

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 
    } 

} 
+3

如果你這樣做,你應該給提取的類一個接口,並將其傳遞給類的構造函數。這樣,只要共享通用接口,就可以將類注入到類中。正如你現在所做的那樣,你只能注入具體的實現,並且不能正確地模擬它。 – cstopher