2016-02-17 44 views
-2
public static void Mock(out IProgram prog, out IJson json) 
{  
    prog = Substitute.For<IProgram>(); 
    IJson = Substitute.For<IJson>(); 

    prog.SaveProg(1, 1, 1, "Somthing", 1, DateTime.UtcNow, 
       (DateTime.UtcNow + TimeSpan.FromDays(10)), 
       10, "[email protected]", DateTime.UtcNow, 1) 
     .Returns(ObjectResult<int?>); 
} 

由於ObjectResult是受保護的類,因此調用Returns(ObjectResult<int?>)時出現錯誤。我該如何解決這個問題,以便能夠從實際方法中調用我的模擬方法?如何使用NSubstitute模擬受保護的方法

+0

感謝Arturo的編輯 –

+1

構成例子的問題是,如果你不檢查它們,它們會比無意義的更糟糕。您可能希望解決的問題有很多問題。您提供的代碼示例不會編譯。 '.Returns'期待一個實例,而不是一個類型。你目前正在模擬接口,它不能有保護方法。 'ObjectResult '不是一個受保護的類(一個類需要嵌套才能被保護)。有不同版本的ObjectResult ,其中一些是密封的,其中一些具有受保護的構造函數。你想與哪個版本合作? – forsvarir

+0

你爲什麼在乎你不能看到的課程結果?你能否以ObjectResult 的結果進行測試,因此你不必觸摸該類? –

回答

-1

您應該無法模擬受保護的類/方法。它受到明確的保護,所以你不能這樣做。如果您需要嘲笑它,請將其公開。如果是別人的方法,而且你認爲你需要嘲笑它,那麼你可能測試不正確。

+1

我不能改變訪問修飾符。除了我所知道的,你還有什麼建議? –

+1

方法不可能被標記爲受保護,以明確防止嘲諷/防止創建測試雙打。在某些情況下,例如'ObjectResult '受保護的構造函數被特別添加以便於創建測試雙打。 https://msdn.microsoft.com/en-us/library/mt154818(v=vs.113).aspx#M:System.Data.Entity.Core.Objects.ObjectResult'1。 – forsvarir

+0

如果你不應該嘲笑受保護的方法,那麼爲什麼有'私人'和'保護'?這實際上是測試框架的限制,因爲我可以擴展該類並模擬出受保護的方法。它應該有'虛擬',如果它真的打算被改變,但我仍然可以嘲笑它。做所有這些來創建測試雙重結果會導致非常繁重的代碼,我希望模擬框架能夠減少。 –

相關問題