2012-01-19 12 views
7

Używam atrybutu metody PostSharp do autoryzacji i inspekcji w mojej usłudze WCF. Działa poprawnie, ale teraz staram się, aby moje testy jednostek działały z atrybutem i staram się znaleźć sposób na wyśmiewanie i wstrzykiwanie właściwości na atrybucie.Najprostszy sposób na fałszywe właściwości atrybutu PostSharp

Mój atrybut jest jak poniżej.

[Serializable] 
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] 
public class AuthoriseAndAuditAttribute : OnMethodBoundaryAspect 
{ 
    private static ILog logger = AppState.logger; 

    private static Ninject.IKernel _kernel = MyKernel.Kernel; 

    private UserRoleTypesEnum _requiredRole = UserRoleTypesEnum.None; 

    [Inject] 
    public IServiceAuthToken _serviceAuthToken { get; set; } 

    [Inject] 
    public UserSessionDataLayer _userSessionDataLayer { get; set; } 

    public AuthoriseAndAuditAttribute(UserRoleTypesEnum role = UserRoleTypesEnum.None) 
    { 
     _requiredRole = role; 
     _kernel.Inject(this); 
    } 

    public override void OnEntry(MethodExecutionArgs args) 
    { 
     // Get the user's session from cookie. 
     UserSession userSession = GetUserSession(); 

     // Check that user is in the required role. 
     bool isAuthorised = (_requiredRole == UserRoleTypesEnum.None || (userSession != null && userSession.Roles.Contains(_requiredRole))); 

     if (!isAuthorised) 
     { 
      logger.Warn("Not authorised for " + args.Method.Name + "."); 
      throw new UnauthorizedAccessException(); 
     } 
     else if (userSession != null) 
     { 
      Thread.CurrentPrincipal = new MyPrincipal(userSession); 
     } 
    } 

    private UserSession GetUserSession() 
    { 
     if (_serviceAuthToken != null) 
     { 
      string sessionID = _serviceAuthToken.GetSessionID(); 

      if (!sessionID.IsNullOrBlank()) 
      { 
       return _userSessionDataLayer.GetForSessionID(sessionID); 
      } 
     } 

     return null; 
    } 
} 

mam ustawienie klasy Singleton się jądro Ninject:

public class MyKernel 
{ 
    public static StandardKernel Kernel { get; set; } 

    static MyKernel() 
    { 
     Kernel = new StandardKernel(); 
     Kernel.Bind<IServiceAuthToken>().To<ServiceAuthToken>(); 
     Kernel.Bind<UserSessionDataLayer>().To<UserSessionDataLayer>(); 
    } 
} 

W moim usług WCF używam PostSharp atrybutu jak poniżej:

[AuthoriseAndAudit(UserRoleTypesEnum.Operator)] 
public JSONResult<bool> IsAliveAuthorised() 
{ 
    return new JSONResult<bool>() { Success = true, Result = true }; 
} 

iw mojej jednostce testowej I Użyłem RhinoMocks, aby spróbować i wyśmiewać dwie właściwości DI w atrybucie.

[TestMethod] 
public void IsAliveAuthorisedIsAuthorisedTest() 
{ 
    var mockServiceAuthToken = MockRepository.GenerateStrictMock<ServiceAuthToken>(); 
    mockServiceAuthToken.Stub(x => x.GetSessionID()).Return("x"); 
    var mockUserSessionDataLayer = MockRepository.GenerateStrictMock<UserSessionDataLayer>(); 
    mockUserSessionDataLayer.Stub(x => x.GetForSessionID(Arg<string>.Is.Anything)).Return(new UserSession()); 

    MyKernel.Kernel.Bind<ServiceAuthToken>().ToConstant(mockServiceAuthToken); 
    MyKernel.Kernel.Bind<UserSessionDataLayer>().ToConstant(mockUserSessionDataLayer); 

    var service = new MyService(); 
    Assert.IsTrue(service.IsAliveAuthorised().Result); 
} 

Problem, który mam, to fałszywe obiekty w teście jednostkowym, które nigdy nie są ustawiane jako właściwości atrybutu. Co robię źle lub odwrotnie, czy istnieje lepszy sposób na testowanie jednostkowe w atrybucie PostSharp? Pamiętając o tym, naprawdę chcę zminimalizować użycie Ninject DI do absolutnego minimum.

+0

Co więc jest przypisane do właściwości? Rzeczywiste obiekty, czy też są puste? –

+1

Nie nie są one puste. Wywołanie _kernel.Inject (this) ustawia te dwa obiekty właściwości. To, co próbuję zrobić z moim testem jednostkowym, to zmiana obiektów, z których jądro końcowe korzysta z jądra, i to jest ten, który nie działa. – sipwiz

+0

Dobrze, więc spodziewasz się, że obiekty Próbne będą tam, ale zamiast tego, są to "prawdziwe" obiekty, które wciąż są wyświetlane? –

Odpowiedz

1

Zamiast [Inject] atrybut swoimi właściwościami, przedefiniować je tak:

public IServiceAuthToken _serviceAuthToken { get { return _kernel.Get<IServiceAuthToken>(); } } 

    public UserSessionDataLayer _userSessionDataLayer { get { return _kernel.Get<UserSessionDataLayer>(); } } 

Również w metodzie badania trzeba re-bind (Zauważ też, że były przy użyciu konkretny typ ServiceAuthToken w pierwszym bindowaniu zamiast interfejsu IServiceAuthToken):

MyKernel.Kernel.Rebind<IServiceAuthToken>().ToConstant(mockServiceAuthToken); 
MyKernel.Kernel.Rebind<UserSessionDataLayer>().ToConstant(mockUserSessionDataLayer); 
+0

To bardzo blisko tego, co zrobiłem. Jedyna różnica polega na tym, że zamiast wywoływać jądro. Przejdź do każdej właściwości, którą nazywam kernel.Inject na początku metody PostSharp OnEntry. I też robię tehe jądro. W moim urządzeniu inicjalizuję test. – sipwiz

Powiązane problemy