2012-01-19 16 views
7

के गुणों का नकल करने का सबसे आसान तरीका मैं अपनी डब्ल्यूसीएफ सेवा पर प्राधिकरण और ऑडिटिंग करने के लिए एक पोस्टशर्प विधि विशेषता का उपयोग कर रहा हूं। यह ठीक से काम कर रहा है लेकिन अब मैं विशेषता के साथ काम कर रहे अपने यूनिट परीक्षण प्राप्त करने की कोशिश कर रहा हूं और विशेषता पर गुणों को नकल करने और इंजेक्ट करने के लिए एक रास्ता खोजने के लिए संघर्ष कर रहा हूं।PostSharp विशेषता

मेरी विशेषता नीचे दी गई है।

[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; 
    } 
} 

मैं एक सिंगलटन वर्ग Ninject गिरी की स्थापना की है:

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

और मेरी इकाई परीक्षण मैं में:

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

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

मेरी WCF सेवा में मैं PostSharp नीचे के रूप में विशेषता का उपयोग विशेषता में दो DI गुणों को आजमाने और नकल करने के लिए राइनोमोक्स का उपयोग कर रहा हूं।

[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); 
} 

मेरे पास जो मुद्दा है, वह इकाई परीक्षण में नकली वस्तुएं कभी भी विशेषता पर गुणों के रूप में सेट नहीं हो रही हैं। PostSharp विशेषता पर यूनिट परीक्षण करने का एक बेहतर तरीका क्या है मैं गलत या विपरीत तरीके से कर रहा हूं? यह भी ध्यान में रखते हुए मैं वास्तव में निचले स्तर पर निनजेक्ट डी के उपयोग को कम करना चाहता हूं।

+0

तो गुणों को क्या सौंपा गया है? वास्तविक वस्तुओं, या वे शून्य हैं? –

+1

नहीं वे शून्य नहीं हैं। _ कर्नेल.इजेक्ट (यह) कॉल दो संपत्ति वस्तुओं को सेट करता है। जो मैं अपने यूनिट टेस्ट के साथ करने की कोशिश कर रहा हूं वह उन वस्तुओं को बदलता है जो निंजा कर्नेल उन्हें सेट करने के लिए उपयोग करता है और यह वह काम है जो काम नहीं कर रहा है। – sipwiz

+0

ठीक है, तो आप मॉक ऑब्जेक्ट्स की अपेक्षा कर रहे हैं, लेकिन इसके बजाय यह "असली" ऑब्जेक्ट्स जो अभी भी दिख रही हैं? –

उत्तर

1
इसके बजाय अपने गुणों पर [इंजेक्षन] विशेषता का उपयोग इस तरह से उन्हें फिर से परिभाषित, की

: अपनी परीक्षा पद्धति में, इसके अलावा

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

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

आप फिर से बाँध (नोट भी है कि आप ठोस प्रकार उपयोग कर रहे थे करने की जरूरत है इंटरफ़ेस IServiceAuthToken के बजाय पहले बाइंड में ServiceAuthToken):

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

यह मेरे द्वारा किए जाने वाले कार्यों के बहुत करीब है। कर्नेल को कॉल करने के बजाए एकमात्र अंतर है। प्रत्येक प्रॉपर्टी पर प्राप्त करें जिसे मैं कर्नेल कहता हूं। PostSharp OnEntry विधि की शुरुआत में इंजेक्ट करें। और मैं भी tehe कर्नेल करता हूँ। मेरे यूनिट परीक्षण प्रारंभिक में रिबिंड। – sipwiz

संबंधित मुद्दे