2008-08-07 8 views
5

मेरा नवीनतम आपदा मॉकिंग के माध्यम से ठोकर खा रहा है कि मुझे वास्तव में IEnumerable<T> की नकली वस्तु के अंदर परिणामों को धक्का देना होगा।आप एक IENumerable <T> ठीक से नकल कैसे करते हैं?

यहां एक नमूना है (केवल IEnumerable<T> के प्रदर्शन, वास्तव में अच्छा नहीं बातचीत आधारित परीक्षण!):

using System; 
using System.Collections.Generic; 
using Rhino.Mocks; 
using MbUnit.Framework; 

[TestFixture] 
public class ZooTest 
{ 
    [Test] 
    public void ZooCagesAnimals() 
    { 
     MockRepository mockery = new MockRepository(); 

     IZoo zoo = new Zoo(); 

     // This is the part that feels wrong to create. 
     IList<IAnimal> mockResults = mockery.DynamicMock<IList<IAnimal>>(); 
     IAnimal mockLion = mockery.DynamicMock<IAnimal>(); 
     IAnimal mockRhino = mockery.DynamicMock<IAnimal>(); 

     using (mockery.Record()) 
     { 
      Expect.Call(zoo.Animals) 
       .Return(mockResults) 
       .Repeat.Once(); 
     } 

     using (mockery.Playback()) 
     { 
      zoo.CageThe(mockLion); 
      zoo.CageThe(mockRhino); 

      Assert.AreEqual(mockResults, new List<IAnimal>(zoo.Animals)); 
     }  
    } 
} 


public class Zoo : IZoo 
{ 
    private IList<IAnimal> animals = new List<IAnimal>(); 

    public void CageThe(IAnimal animal) 
    { 
     animals.Add(animal); 
    } 

    public IEnumerable<IAnimal> Animals 
    { 
     get 
     { 
      foreach(IAnimal animal in animals) 
      { 
       yield return animal; 
      } 
     } 
    } 
} 

public interface IAnimal 
{ 
} 

public interface IZoo 
{ 
    IEnumerable<IAnimal> Animals { get;} 
    void CageThe(IAnimal animal); 
} 

मुझे पसंद नहीं है मैं यह कैसे निम्नलिखित कारणों के लिए काम करने के लिए मिल गया:

  • IEnumerable<IAnimal> उपभोग IList<IAnimal> में परिणाम - क्योंकि मुझे लगता है कि यह परिणामों को ढेर पर जांचने के लिए रखता है।
  • परिणामों की सामग्री सेट अप करना - जो मैं भी समझता हूं; लेकिन मेरा मुख्य बिंदु यह जांचना है कि Zoo.AnimalsIEnumerable<IAnimal> लौटा रहा है, और इससे भी बेहतर, कि यह yield return अंदर उपयोग कर रहा है।

यह बेहतर या सरल करने पर कोई सुझाव?

संपादित करें: मैं IEnumerable<T> और जो भी मैं उपयोग कर रहा हूं, के बीच बातचीत का परीक्षण करने का सबसे अच्छा तरीका निर्धारित करने का प्रयास कर रहा हूं। मैं परीक्षण करने की कोशिश नहीं कर रहा हूं कि Zoo जानवरों को पकड़ सकता है, बल्कि ZooIEnumerable<IAnimal> के रूप में खुलासा करता है, और yield return भी इसका उपयोग किया जा रहा है।

+1

पीछे की ओर, यह एक ** ट्रिब्रिबल ** प्रश्न है। वोट बंद करने की कोशिश कर रहा है –

उत्तर

4

यदि आप कार्यान्वयन का परीक्षण कर रहे हैं, तो आप इसे पहले स्थान पर क्यों मजाक करने की कोशिश कर रहे हैं? क्यों न केवल पिंजरे (IAnimal) और फिर जांचें कि पशु में IAimal है?

मुझे लगता है कि आप IAnimals का मज़ाक उड़ा रहे हैं, क्योंकि जाहिर है कि आपके पास अभी तक कोई ठोस जानवर नहीं है, लेकिन क्यों न केवल उन्हें स्टब्स बनाते हैं, क्योंकि जाहिर है कि आप किसी और चीज की अपेक्षा नहीं कर रहे हैं उन्हें सूची में रखने के अलावा?

संपादित करें: मोटे तौर पर इन पंक्तियों के साथ कुछ (परीक्षण नहीं, संकलन नहीं हो सकता है, अपने कुत्ते आदि खा सकते हैं):

[TestFixture] 
public class ZooTest 
{ 
    [Test] 
    public void ZooCagesAnimals() 
    { 
     MockRepository mockery = new MockRepository(); 

     IAnimal mockLion = mockery.Stub<IAnimal>(); 
     IAnimal mockRhino = mockery.Stub<IAnimal>(); 

     IZoo zoo = new Zoo(); 

     zoo.CageThe(mockLion); 
     zoo.CageThe(mockRhino); 

     List<IAnimal> animals = new List<IAnimal>(zoo.Animals); 
     Assert.IsTrue(animals.Contains(mockLion)); 
     Assert.IsTrue(animals.Contains(mockRhino)); 
    } 
} 
3

मैं काफी आप पर नकली उम्मीदों की स्थापना के लिए कैसे उम्मीद नहीं दिख रहा है एक ऑब्जेक्ट जो शुरू करने के लिए एक नकली नहीं है। इसके अलावा, आप एक आईएलिस्ट को वापस करने की उम्मीद स्थापित कर रहे हैं जो वास्तव में तब नहीं होता जब संकलक एक इटरेटर उत्पन्न करता है।

आप विशेष रूप से इटरेटर का परीक्षण करना चाहते हैं, तो आप चाहिए शायद

Assert.IsNotNull(zoo.Animals); 

और फिर सत्यापित करें कि प्रगणक वास्तव में सभी चीजें आप चिड़ियाघर में जोड़ा अधिक विश्लेषण करता है। मैं वहां के लिए क्या जा रहा था। :)

मुझे यकीन नहीं है कि अगर उपज रिटर्न कहा जा रहा है तो परीक्षण करना संभव है, क्योंकि उपज रिटर्न एक कंपाइलर से उत्पन्न आईनेमरेबल के लिए सिंटैक्टिक चीनी है। उदाहरण के लिए,

zoo.Animals.GetEnumerator(); 

गणनाकर्ता में लिखे गए किसी भी कोड को निष्पादित नहीं करेगा। पहली बार ऐसा होता है INumerator के लिए पहली कॉल पर होता है।MoveNext();

अब, अगर आपको लगता है कि चिड़ियाघर में रखे हुए ठोस चिड़ियाघर और IEnumerable के बीच बातचीत का परीक्षण करने की कोशिश कर रहे हैं, तो आप IEnumerable एक क्षेत्र चिड़ियाघर पर बनाने के लिए और इसके स्थान पर कोई ठोस IEnumerable को लागू करने की है कि क्षेत्र के लिए एक नकली IEnumerable इंजेक्षन चाहिए सीधे चिड़ियाघर में।

मुझे आशा है कि यह कुछ सहायता की है।

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