Тестирование Visual Studio 2012 с использованием csla и Entity Framework
В VS2010 мой тест MSTest запускался просто отлично.
При запуске в VS2012 я получаю ошибку. Тест устанавливает Csla.ApplicationContext.User с пользовательским бизнес-принципалом. Когда EntityFramework просят предоставить новый ObjectContext, я получаю исключение SerializationException, в котором говорится, что мой тип Custom Business Principal не найден.
Все тесты, использующие EntityFramework, не выполняются при запуске через тестировщик VS2012 или тестировщик Resharper7. Я попробовал тест-бегун NCrunch, и все они прошли.
Как я могу решить эту проблему?
2 ответа
Я нашел свою настоящую проблему. VS2012 запускает тесты в отдельном домене приложений, и наш слой доступа к данным загружается через Reflection. Мы до сих пор не уверены, почему EF требует знания принципала, но наше решение состояло в том, чтобы сбросить наш принципал до GenericPrincipal до доступа к EF и затем вернуть оригинал. Я все еще борюсь с мыслью, что, возможно, контейнер IoC облегчит эту проблему
Вы также должны обратить внимание на основной подход претензий.net 4.5. Я использую EF5.0 на VS2012, ориентируясь на цель.net4.5.net4.5, чтобы проверить разницу между WindowsIdentity.GetCurrent().Name;
а также Thread.CurrentPrincipal
Я использую небольшую процедуру, подобную этой, при авторизации FORMS. Таким образом, Windows Auth и Forms Auth могут играть вместе.
Не совсем та же ситуация, но она подчеркивает важное различие, которое упускается из виду, когда все просто работает.
Стоит быстро прочитать... 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;
}
}
}