2012-07-16 123 views
0

因此,在MVC測試是一個痛苦的屁股,因爲MS的所有愚蠢的靜態方法,但我已經能夠解決其中的一些 - 我創建了一個會員界面,以便我可以嘲笑它,而且主要工作,但我在我的自定義UserProfile對象中使用ProfileBase,這當然更難,因爲它也有靜態方法,它繼承自ProfileBase。我整個星期天都浪費了,無法弄清楚如何測試。是否有更好的模式來實現使用profilebase的類?

這是我的UserPofile類的樣子 - 它的確和在線的所有例子都一樣。

namespace TaskBoardAuth.Models 
{ 
    public class UserProfile: ProfileBase 
    { 
     public static UserProfile GetUserProfile(string username) 
     { 
      return Create(username) as UserProfile; 
     } 

     public static UserProfile GetUserProfile() 
     { 
      return Create(Membership.GetUser().UserName) as UserProfile; 
     } 

     [SettingsAllowAnonymous(false)] 
     public string FirstName 
     { 
      get { return base["FirstName"] as string; } 
      set { base["FirstName"] = value; } 
     } 

     [SettingsAllowAnonymous(false)] 
     public string LastName 
     { 
      get { return base["LastName"] as string; } 
      set { base["LastName"] = value; } 
     } 

    } 
} 

問題是我無法測試,因爲這兩個愚蠢的蹩腳的靜態方法,沒關係profileBase.Create()是靜態的。呃!那如此!

無論如何 - 這裏是我卡住的地方 - 我需要在方法中做到這一點。

taskBoardModel.Name = UserProfile.GetUserProfile().FirstName + " " + UserProfile.GetUserProfile().LastName; 

我的單元測試當然爆炸了,因爲對Membership.GetUser()的調用失敗!呃!!!

任何人有任何建議嗎?

回答

2

在處理任何框架問題(如此MVC問題)時,我通常會在需要測試/模擬的內部類的周圍創建一個包裝類和相應的接口。然後我配置我的IoC容器,將其注入到控制器的構造函數IUserProfile接口中。所以在我的單元測試中,我只是嘲笑我的IUserProfile並提供我想要的任何數據。

Membership.GetUser()問題可以通過創建包裝類和接口以相同的方式解決。

我曾經擔心過這樣的問題,但現在我甚至不會爲此而出汗,只是圍繞.NET的瘋狂密封類和靜態方法等等創建包裝類。

+0

嗯,這正是我對會員的東西所做的,這對我來說很清楚,因爲我只是創建了一個IMembershipService,並且它的實際實現爲我調用了這些靜態方法。有了這個,我有點不確定有兩件事情會給我造成困惑。 1)有些方法是靜態的其他方法不是和兩個,我從具有相同問題的ProfileBase繼承,而ProfileBase.Save()可以被模擬ProfileBase.Create()不能。嗯,我可能不得不惹惱它,但我明白了。 – Kenn 2012-07-16 12:15:07

相關問題