2011-11-01 12 views
28

मैं एक आवेदन के लिए परीक्षण विकसित कर रहा हूं। एक विधि है जिसमें पैरामीटर के रूप में params सरणी है। मैंने मोक का उपयोग करके विधि स्थापित की है लेकिन जब मैं परीक्षण चलाता हूं, तो विधि का वापसी मूल्य शून्य है, जिसका अर्थ है कि इसे मजाक नहीं किया जा रहा है।पैराम्स ऐरे के साथ सेटअप विधि

यहाँ एक कोड नमूना है:

public interface ITicketManager { 
    string GetFirstTicketInQueueIfMatches(params string[] ticketsToMatch); 
} 

public class TicketManager : ITicketManager { 
    private Queue<string> ticketQueue = new Queue<string>(); 

    public string GetFirstTicketInQueueIfMatches(params string[] ticketsToMatch) { 
     var firstQueuedTicket = ticketQueue.Peek(); 
     var firstQueuedTicketMatchesAnyOfRequested = ticketsToMatch.Any(t => t == firstQueuedTicket); 

     if(firstQueuedTicketMatchesAnyOfRequested) 
      return firstQueuedTicket; 

     return null; 
    } 
} 

नकली कोड इस तरह दिखता है:

var mock = new Mock<ITicketManager>(); 

mock.Setup(m => m.GetFirstTicketInQueueIfMatches(It.IsAny<string>())) 
    .Returns(p => { 
    if(p.Contains("A")) 
      return "A"; 

    return null; 
}); 

क्यों यह कभी नहीं मज़ाक उड़ाया विधि हिट?

उत्तर

50

आप एक सरणी के बजाए एक स्ट्रिंग लेने की विधि को कॉल करने का प्रयास कर रहे हैं। ध्यान रखें कि यह सी # कंपाइलर है जो params भाग को संभालता है, जो कॉलिंग कोड को परिवर्तित करता है जो केवल सरणी में गुजरने वाले कॉल में व्यक्तिगत मान निर्दिष्ट करता है। जहां तक ​​विधि स्वयं चिंतित है, यह सिर्फ एक सरणी प्राप्त कर रहा है - और यही वह है जो आप मजाक कर रहे हैं।

संकलक वास्तव में है में अपने कोड बदल:

mock.Setup(m => m.GetFirstTicketInQueueIfMatches 
         (new string[] { It.IsAny<string>() })) 

जो नहीं है तुम क्या चाहते।

आप उपयोग करना चाहिए:

mock.Setup(m => m.GetFirstTicketInQueueIfMatches(It.IsAny<string[]>())) 

आप सत्यापित करने के लिए यह केवल एक ही मान दिया जाता है कि जरूरत है, तो आप ऐसा करने के लिए है कि एक ही तरीका है कि आप एक गैर पैरामीटर पैरामीटर के लिए होगा में की आवश्यकता होगी।

असल में, params केवल सी # कंपाइलर में अंतर बनाता है - moq पर नहीं।

+0

@DiegoAC से मिलान किया गया है: ठीक है तुम मिल गया है यह * सशर्त * लौटने 'वैसे भी null'। क्या आपने इसे "फू" वापस करने की कोशिश की है, यदि 'p' में '' '' नहीं है? इस तरह आप इसे कम से कम देख रहे होंगे ... –

+0

उत्कृष्ट जवाब जॉन। धन्यवाद। दरअसल मैं केवल एक ही स्ट्रिंग प्राप्त कर रहा था। संकलक के बारे में स्पष्टीकरण बहुत उपयोगी था। –

9

मेरा मानना ​​है कि params stringIt.IsAny<string[]>() बजाय It.IsAny<string>()

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