2012-06-21 67 views
10

我一直在试图嘲笑一个使用文件流,但一直未能完成这一点,我不确定如何做到这一点,我正在使用rhino模拟。嘲笑一个使用FileStream

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 
} 

任何人都可以告诉我如何嘲笑使用(FileStream ....),所以我能够访问这个代码分支?

回答

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()您不能直接将模拟注入此方法调用froma,因此请显示如何调用此方法。

0

从而使的FileStream传递给方法,以便您可以创建FILESTREAM

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

的模拟,如果你真的想获得看上你总是可以接受的IStream,然后我会重构方法concreate类的模拟是的IStream,但犀牛支持创建嘲笑

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

您可以使用SystemWrapper lib来达到此目的。它包含包装系统类的接口和类,并使您能够使用此类来单元测试方法。