2016-11-02 158 views
1

我是JustMock嘲笑框架的新手,我試圖嘲笑一種私人方法。我完全意識到單元測試私有方法通常是不好的做法,但在這種情況下,我別無選擇。我一直在看官方文件(http://www.telerik.com/help/justmock/advanced-usage-mocking-non-public-members-and-types.html),但似乎沒有任何工作。JustMock:嘲弄私人方法

這裏是我的示例代碼:

using System; 
using Telerik.JustMock; 

public class Program 
{ 
    public class Foo 
    { 
     public void useA() 
     { 
      a(); 
     } 

     private void a() 
     { 
      Console.WriteLine("AAAAAAAAAAAAAAA"); 
     } 
    } 

    public static void Main() 
    { 
     var mockeClass = Mock.Create<Foo>(Behavior.CallOriginal); 
     Mock.NonPublic.Arrange(mockeClass, "a").DoInstead(() => Console.WriteLine("Mock success!!!"));  

     mockeClass.useA(); 
    } 
} 

這裏是錯誤日誌:

Run-time exception (line 21): The type initializer for 'Telerik.JustMock.Core.Context.MockingContext' threw an exception. 

Stack Trace: 

[System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.] 

[System.TypeInitializationException: The type initializer for 'Telerik.JustMock.Core.Context.MockingContext' threw an exception.] 
    at Program.Main(): line 21 

我只是困惑,爲什麼它不工作。

+2

如果你別無選擇,只能測試一個私有方法,那麼該方法可能不應該是私有的。考慮將方法提取到可以直接測試的自己的類中,而不是通過測試其調用者。 – Kritner

+0

問題是我要測試的代碼結構非常糟糕。我無能爲力。我有另一種情況是私有方法返回一個值影響我正在測試的方法的邏輯。這就是爲什麼我需要嘲笑它。 @Kritner –

回答

0

有時候測試有助於讓我們知道如何改進我們的代碼,或者應該如何構建它,在我看來,就像Kritner說的那樣,功能應該是公開的而不是私有的。另一方面,如果你想保持私有方法,而不是測試對私有方法的調用,你可以在你的公共方法(私有方法被調用的地方)中測試私有方法中的代碼是在公共方法中正確調用,如私有方法不存在,代碼直接寫入公共方法。

編輯:您甚至可以創建一個調用私有方法的簡單函數(並在可能的情況下添加一些與調用相關的邏輯)並測試此函數。

+0

通過實際的單元測試,我無法編輯課程。這樣說:我在這個例子中的主程序相當於單獨項目中的單元測試方法。而班級也在一個單獨的項目中。 –

+0

我想你可以嘗試測試該方法useA()在類Console中調用方法writeLine,其參數爲「AAAAAAAAAAAAAAA」。 – Iskariote

+0

是的,這個例子可以工作,但是如果你必須有特定的參數值才能放入方法,因爲它會有一個複雜的算法,如果確切的話肯定會返回一個「AAAAAAAAAAAAAAA」字符串。 –

0

我試着在一個乾淨的.NET 4.5控制檯項目中運行你的代碼,它按預期工作 - a()確實打印出嘲笑的值。 FileIOPermission是一個非常從JustMock獲得的異常異常,可能是迄今爲止的第一次。一般而言,權限錯誤對於控制檯應用程序來說更是不尋常,因爲它們通常以完全信任的方式運行。

如果您將它的調用堆棧粘貼到System.TypeInitializationException的票InnerException中將會非常有幫助。從調試器複製它。