2012-08-22 69 views
13

在VS2010中,我的MSTest測試運行得很好。Visual Studio 2012用csla和實體框架測試

在VS2012中運行時出現錯誤。測試將Csla.ApplicationContext.User設置爲自定義業務主體。當EntityFramework被要求提供一個新的ObjectContext時,我收到一個SerializationException,說我的自定義業務主體類型找不到。

所有使用EntityFramework的測試在通過VS2012的測試運行器或Resharper7的測試運行器運行時都會失敗。我已經嘗試過NCrunch的測試跑步者,他們都通過了。

我怎樣才能解決這個問題?

+2

我發現我真正的問題。 VS2012在單獨的AppDomain中運行測試,我們的數據訪問層通過Reflection進行加載。仍然不確定爲什麼EF需要委託人的知識,但我們的解決方案是在訪問EF之前將我們的委託人重置爲GenericPrincipal,然後放回原始。我仍然在想,也許一個IoC容器可以緩解這個問題。 –

+0

您是否可以將您的調查結果添加爲答案,並將其標記爲已接受,如果它解決了問題? –

回答

2

我找到了我真正的問題。 VS2012在單獨的AppDomain中運行測試,我們的數據訪問層通過Reflection進行加載。仍然不確定爲什麼EF需要委託人的知識,但我們的解決方案是在訪問EF之前將我們的委託人重置爲GenericPrincipal,然後放回原始。我仍然在想,也許一個IoC容器會緩解這個問題

+0

其實我不認爲EF想知道你的委託人的具體情況,但它可能會查看它,並且當它試圖將對象從原始appdomain溼潤到這個新的時候,它會失敗(因爲它無法找到你的委託人在你的委員會中定義 – Andy

0

您還應該注意.net 4.5聲明的主要方法。 IM在VS2012使用EF5.0目標.net4.5目標.net4.5 測試WindowsIdentity.GetCurrent().Name;
Thread.CurrentPrincipal

之間的區別我用一個小的程序是這樣下的窗體身份驗證。 因此Windows身份驗證和表單身份驗證可以一起玩。

不完全相同的情況,但它確實突出顯示了一切正常工作時忽略的重要區別。
值得一快速閱讀... http://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal.current

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Security.Claims; 
using System.Security.Principal; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Web; 


namespace BosIdentityManager 
{ 
public class BosPrincipal 
{ 
    /// <summary> 
    /// The current principal is set during FORMS authentication. If WINDOWS auth mode is in use, Windows sets it. 
    /// </summary> 
    /// <returns> The Name from Thread.CurrentPrincipal.Identity.Name unless alternate delegate is configured</returns> 
    public static string GetCurrentUserName() 
    { 
    // http://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal.current 
    // with forms auth and windows integrated,ClaimsPrincipal.Current will be set. 

     var prin = ClaimsPrincipal.Current; //normally this reverts to Thread.CurrentPrincipal, but can chnage ! 
     return prin.Identity.Name; 

    } 

    public static string GetCurrentWindowsUserName() 
    { 
     return WindowsIdentity.GetCurrent().Name; 
    } 

    public static void SetPrincipal(BosMasterModel.Membership memb) 
    { 
     var claims = new List<Claim>(){ new Claim(ClaimTypes.Name, memb.SystemUser.UserName), 
             new Claim(ClaimTypes.NameIdentifier,memb.UserId.ToString()), 
             new Claim(ClaimTypes.Role, "SystemUser") }; 

     var ClaimsId = new ClaimsIdentity(claims,"Forms"); 

     var prin = new ClaimsPrincipal(ClaimsId); 
     Thread.CurrentPrincipal = prin; 

    } 
} 
} 
相關問題