2014-04-24 6 views
6

मैं एक एमवीसी 5 परियोजना में सिग्नलआर का उपयोग कर रहा हूं। मैं इस तरह नियंत्रक के भीतर कॉल कर रहा हूं:यूनिट परीक्षण के लिए नियंत्रक में सिग्नलआर हबकॉन्टेक्स्ट को कैसे नकल करना चाहिए?

private Microsoft.AspNet.SignalR.IHubContext blogHubContext = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<BlogHub>(); 
blogHubContext.Clients.All.addNewBlogToPage(RenderPartialViewToString("Blog", model)); 

मैं इकाई को इस नियंत्रक के भीतर कार्यों का परीक्षण करने का प्रयास कर रहा हूं। यूनिट परीक्षण ठीक काम कर रहे थे जब तक कि मैंने सिग्नलर कार्यक्षमता को जोड़ा नहीं। अब मैं हबकॉन्टेक्स्ट को नकल करने का तरीका जानने का प्रयास कर रहा हूं। मेरे पास 2 संभावनाएं हैं I

  1. मैं सेटअप निर्माता में हब तो मैं की तरह कुछ है निम्नलिखित:

    private Microsoft.AspNet.SignalR.IHubContext blogHubContext; 
    public BlogController(Microsoft.AspNet.SignalR.IHubContext topicHub = null){ 
        blogHubContext = (blogHub != null) ? blogHub : Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<BlogHub>(); 
    } 
    

    तो मैं किसी भी तरह HubContext नकली और नियंत्रक को इसके माध्यम से भेज जब मैं इकाई में यह बना सकते हैं परीक्षा। अब तक मैं केवल इस यद्यपि है:

    Mock<IHubContext> blogHub = new Mock<IHubContext>(); 
    

    (नोट:। मैं सब कुछ सरल बनाया है चीजों में से केवल SignalR पक्ष पर ध्यान केंद्रित करने की भी नियंत्रक आदि में प्रयोग किया जाता खजाने कर रहे हैं)

  2. वैकल्पिक रूप से, मैं हब को लपेटने के लिए एक और कक्षा बनाने के बारे में सोचा, और उसके बाद हब में कॉल करने के लिए बस इस से कॉल करें। यह मुझे अपने यूनिट परीक्षणों के लिए नकली करने के लिए बहुत आसान लगता है, लेकिन यह सुनिश्चित नहीं है कि यह एक अच्छा विचार है या नहीं।

दिशा-निर्देश की सराहना की। या दोनों स्वीकार्य तरीके आगे हैं? धन्यवाद।

+0

मैं 1 विकल्प पसंद करते हैं, क्योंकि आप आवरण वर्ग का एक और अतिरिक्त परत है जो किसी भी कार्यक्षमता जोड़ने नहीं है की जरूरत नहीं है। –

+0

@ एडी.Net धन्यवाद। उस स्थिति में, किसी भी विचार से मैं जिस कार्यक्षमता का उपयोग कर रहा हूं उसके लिए हब का मज़ाक लगाने के बारे में कैसे जा सकता हूं। मैं यह काम करने के लिए संघर्ष कर रहा हूं कि इसे कैसे किया जाए जिससे मुझे दूसरे विकल्प के बारे में सोचने का मौका मिला। – AndrewPolland

+0

क्या आप सामान्य रूप से मजाक करने से परिचित हैं? सिग्नलर हब का मज़ाक लगाना ऐसा लगता है कि यह किसी और चीज का मज़ाक लगाने जैसा ही होगा। –

उत्तर

1

अद्यतन, कृपया यह कोड देखें, मैं इसे डिफ़ॉल्ट एमवीसी टेम्पलेट से दूर कर रहा हूं। एक रैपर वर्ग की कोई ज़रूरत नहीं है।

public class HomeController : Controller 
{ 
    private readonly IHomeHub _hub; 

    public HomeController(IHomeHub hub) 
    { 
     _hub = hub; 
    } 

    public ActionResult Index() 
    { 
     _hub.Hello(); 
     return View(); 
    } 
} 

public interface IHomeHub 
{ 
    void Hello(); 
} 

public class HomeHub : Hub, IHomeHub 
{ 
    public void Hello() 
    { 
     Clients.All.hello(); 
    } 
} 

इकाई परीक्षण के लिए:

[TestMethod] 
public void Index() 
{ 
    var mockHub = new Mock<IHomeHub>(); 
    // Arrange 
    HomeController controller = new HomeController(mockHub.Object); 

    // Act 
    ViewResult result = controller.Index() as ViewResult; 

    // Assert 
    Assert.IsNotNull(result); 
    mockHub.Verify(h=>h.Hello(), Times.Once); 
} 
+0

यह वास्तव में अच्छा लग रहा था। लेकिन अगर यह स्थैतिक है, तो यह केवल हब (नियंत्रक के भीतर) से किसी फ़ंक्शन को कॉल करने में सक्षम होने के कारण इसे काम नहीं कर सकता है, जिसे इंटरफ़ेस से लागू किया जा सकता है। तो वैसे भी मेरी समझ। – AndrewPolland

+0

क्षमा करें यह स्पष्ट नहीं है, विधि हैलो हब क्लास पर स्थिर नहीं है और आप इसे नियंत्रक से कॉल कर सकते हैं। –

+0

क्षमा करें, उस समस्या का हिस्सा मेरा अंत था। जैसा कि मैं सोच रहा था स्टेटिक की जरूरत नहीं है। हालांकि, नियंत्रक से विधि हैलो को कॉल करते समय, क्लाइंट को आपके पास जिस तरह से नहीं कहा जा सकता है। यह निम्न त्रुटि उत्पन्न करता है: HubPipeline द्वारा बनाए गए हब इंस्टेंस का उपयोग असमर्थित है। – AndrewPolland

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