2011-09-27 71 views
1

我想寫一些先前編寫的代碼之前,我開始用它來測試它的測試。我遇到了控制器方法引用T4MVC爲圖像和鏈接所做的一些靜態變量的問題。它實際上和我以前的問題here一樣,但它不在構造函數中。T4MVC和測試與MvcContrib.TestHelpers問題與靜態鏈接的內容

的問題是這樣的代碼:

if (User.IsInRole("Rate Admin") || User.IsInRole("Administrator")) 
     { 
      _ratesViewData.ActionLinks = new List<CustomActionLink> 
              { 
               new CustomActionLink("Edit", 
                     editPath + Resources.DelimeterHyphen, 
                     Links.Content.Images.openwhite_gif), 
               new CustomActionLink("Delete", 
                     statusPath + Resources.DelimeterHyphen, 
                     Links.Content.Images.openwhite_gif) 
              }; 
     } 

的問題是Links.Content.Images.openwhite_gif,在T4MVC下生成的代碼從靜態方法調用ProcessVirtualPath VirtualPathUtility.ToAbsolute。我似乎無法模擬ProcessVirtualPath或VirtualPathUtility。

現在上面的ProcessVirtualPath評論說,它是通過委託調用,以允許它被替換爲單元測試。代表是:

public static Func<string, string> ProcessVirtualPath = ProcessVirtualPathDefault; 

如何替換正在調用ProcessVirtualPath以允許進行單元測試。我不在乎它是否真的有效,我只是不想讓它炸燬。我可以從我的測試方法做到這一點嗎?在不更改代碼的情況下測試它是否在非測試項目中進行調試?

另外一個相關的問題是什麼是上面的一段代碼的最佳做法?在哪裏應該有基於權限的條件代碼?甚至行動鏈接。我不確定他們爲什麼處於viewdata模式。


好的我確實得到了這個與評論中提到的代碼一起工作。

T4MVCHelpers.ProcessVirtualPath = (s) => "~/Content/Images"; 

但只有當試驗是單獨跑,需要如果與使用TestControllerBuilder類,不設置其他的測試運行,這將失敗的任何測試。爲什麼?

+0

我有同樣的問題。這沒有任何意義。我將代理設置爲我自己的,但該設置被忽略。我不能爲我的生活弄清楚如何在運行時不能設置靜態代理。 –

+0

我沒有得到這個與T4MVCHelpers.ProcessVirtualPath =(s)=>「〜/ Content/Images」一起工作;但是......它只在測試本身運行時才起作用,而不是在包含所有其他測試的組中。使它變得毫無用處。 – nportelli

回答

3

也許我沒有完全理解這個問題,但爲什麼不能將T4MVCHelpers.ProcessVirtualPath設置爲其他方法呢?

+0

我認爲這是我的問題,我以爲我做了,似乎沒有工作。我暫時放棄了,但計劃迴旋。我認爲你可以再次忽略我和我的T4MVC問題,我很確定這只是我所有的測試和ASP MVC的noobness – nportelli

2

如果我在我的測試類的靜態構造函數中設置ProcessVirtualPath委託,我能夠得到這個工作。

public class BaseTest 
{ 
    static BaseTest() 
    { 
     T4MVCHelpers.ProcessVirtualPath = s => s.TrimStart('~'); 
    } 

    // TEST CODE 

}