2012-06-21 16 views
10

के साथ एक प्रयोग का मज़ाक उड़ाते हुए मैं एक फ़ाइल स्ट्रीम के साथ उपयोग करने का प्रयास कर रहा हूं लेकिन इसे पूरा करने में सक्षम नहीं हूं और यह सुनिश्चित नहीं कर रहा हूं कि मैं इसे कैसे कर सकता हूं, मैं राइनो मॉक का उपयोग कर रहा हूं।एक फ़ाइलस्ट्रीम

private Connection LoadConnectionDetailsFromDisk(string bodyFile) 
{  
    //logic before 
    using (FileStream fs = File.Open(bodyFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
    return this.serverConfiguration.LoadConfiguration(fs, flowProcess); 
    } 
    //more logic 
} 

क्या कोई मुझे बता सकता है कि इसका उपयोग कैसे करें (फ़ाइलस्ट्रीम ....) ताकि मैं कोड की इस शाखा तक पहुंच सकूं?

उत्तर

9

फिर आप आप इसे करने में सक्षम मजाक कॉल होगा एक अंतरफलक विधि द्वारा सार File.Open() किया है।

तो

1) एक इंटरफेस बनाएँ:

public interface IFileDataSource 
{ 
    FileStream Open(string path, 
        FileMode mode, 
        FileAccess access, 
        FileShare share); 
} 

2) निम्नलिखित के रूप में LoadConnectionDetailsFromDisk() बदलें:

private Connection LoadConnectionDetailsFromDisk(string path, IFileDataSource fileSource) 
{  
    using (FileStream fs = fileSource.Open(bodyFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
     return this.serverConfiguration.LoadConfiguration(fs, flowProcess); 
    } 

    //more logic 
} 

3) एक परीक्षण में इंटरफ़ेस नकली और एक नकली

इंजेक्षन
// create a mock instance 
var sourceMock = MockRepository.GenerateMock<IFileDataSource>(); 

// setup expectation 
sourceMock.Expect(m => m.Open("path", FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 
     .CallBack(
delegate (string path, FileMode mode, FileAccess access, FileShare share) 
{ 
     // handle a call 

    return true; 
}).Repeat.Any(); 

// TODO: depends on how you are triggering LoadConnectionDetailsFromDisk method call 
// inject a mock 

LoadConnectionDetailsFromDisk() पर विचार करते हुए आप सीधे इस विधि कॉल से परीक्षण के लिए नकली इंजेक्ट नहीं कर सकते हैं, इसलिए कृपया यह तरीका दिखाएं कि यह विधि कैसे लागू की जाती है।

0

मैं विधि refactor होगा ताकि FileStream विधि को पारित कर दिया है, ताकि आप filestream

private Connection LoadConnectionDetailsFromDisk(FileStream bodyFile) 
{ 
    .... 
} 

की एक नकली यदि आप वास्तव में आप हमेशा एक IStream स्वीकार कर सकते हैं फैंसी प्राप्त करना चाहते हैं बना सकते हैं और उसके बाद concreate वर्गों के नकली कि IStream लेकिन राइनो समर्थन बनाने mocks

MockRepository mocks = new MockRepository(); 
FileStream basket = mocks.CreateMock<FileStream>(); 
1

आप इस उद्देश्य के लिए SystemWrapper lib का उपयोग कर सकते हैं। इसमें इंटरफेस और कक्षाएं कक्षा कक्षाओं को लपेटती हैं और आपको कक्षाओं का उपयोग करके यूनिट परीक्षण विधियों में सक्षम बनाती हैं।

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