2012-06-21 34 views
10

Tôi đã cố gắng thử một cách sử dụng với một luồng tệp nhưng không thể hoàn thành việc này và không chắc chắn cách thực hiện, tôi đang sử dụng mô hình tê giác.Mocking a Sử dụng với một 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 
} 

bất cứ ai có thể cho tôi biết làm thế nào để thử bằng cách sử dụng (FileStream ....) vì vậy tôi có thể truy cập chi nhánh này của mã?

Trả lời

9

bạn phải trừu tượng File.Open() bởi một phương pháp giao diện sau đó bạn sẽ có thể gọi mocking với nó.

Vì vậy

1) Tạo một giao diện:

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

2) Thay đổi LoadConnectionDetailsFromDisk() như sau:

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) Trong một thử nghiệm thử giao diện và tiêm một mock

// 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 

Xét rằng LoadConnectionDetailsFromDisk() bạn không thể tiêm giả trực tiếp vào phương thức này gọi kiểm tra froma vì vậy hãy chỉ ra cách phương thức này được gọi.

0

tôi sẽ cấu trúc lại phương pháp để các FileStream được truyền cho phương pháp để bạn có thể tạo ra một mô hình của FileStream

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

nếu bạn thực sự muốn có được ưa thích bạn luôn có thể chấp nhận một IStream và sau đó Mock rằng IStream nhưng Rhino hỗ trợ tạo mocks của lớp concreate

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

Bạn có thể sử dụng SystemWrapper lib cho mục đích này. Nó chứa các giao diện và các lớp bao quanh các lớp hệ thống và cho phép bạn các phương thức kiểm tra đơn vị sử dụng các lớp này.

Các vấn đề liên quan