2011-06-27 7 views
6

Tôi mới dùng Kiểm thử Đơn vị và tôi cần giả lập lớp tĩnh Tệp trong không gian tên System.IO. Tôi đang sử dụng RhinoMock, cách tốt nhất để thực hiện điều này là gì,Tệp Mô phỏng IO lớp tĩnh trong C#

phép nói rằng tôi cần phải thử các File.Exists, File.Delete ...

+0

Rất nhiều ví dụ trên trang web này, sử dụng nút tìm kiếm – ChrisBint

+1

có thể trùng lặp với [Mocking static methods using Rhino.Mocks] (http: // stackoverflow.com/questions/540239/mocking-static-phương pháp-sử dụng-tê giác-mocks) – sarnold

+4

Đôi khi mọi người không biết những gì để tìm kiếm, có lẽ bạn có thể đưa ra một số ví dụ chứ không phải là hoàn toàn vô dụng. Chỉ là một ý nghĩ. – CrazyDart

Trả lời

7

Bạn không thể thử phương pháp tĩnh với Rhino giả . Xem this question để biết thêm thông tin. Bạn có thể tạo một lớp mặt tiền để bọc các cuộc gọi hệ thống tệp mà bạn sẽ sử dụng và sau đó tạo một phiên bản giả lập của nó.

+0

Thay vì làm cho mặt tiền của riêng bạn, sử dụng một người khác đã viết cho bạn: http://systemioabstractions.codeplex.com/ – vcsjones

+0

Thx điều này là tuyệt vời, tôi sẽ sử dụng mã nguồn mở này –

+0

Không chắc chắn tôi sẽ đặt trứng trong một giỏ mà chỉ có khoảng 50 người khác sẵn sàng sử dụng ... nhưng đó là dự án của bạn. – CrazyDart

2

Bạn nên tạo dịch vụ bao bọc được gọi là IFileService, sau đó bạn có thể tạo bê tông sử dụng thống kê để sử dụng trong ứng dụng của mình và IFileService giả sẽ có chức năng giả để thử nghiệm. Làm cho nó vì vậy bạn phải vượt qua IFileService vào constructor hoặc một tài sản cho những gì bao giờ lớp đang sử dụng nó, theo cách này hoạt động bình thường yêu cầu bạn vượt qua trong IFileService. Hãy nhớ rằng trong bài kiểm tra đơn vị bạn đang kiểm tra chỉ một phần của mã không phải là thứ mà nó gọi là IFileService.

interface IFileService 
{ 
    bool Exists(string fileName); 
    void Delete(string fileName); 
} 

class FileService : IFileService 
{ 
    public bool Exists(string fileName) 
    { 
     return File.Exists(fileName); 
    } 

    public void Delete(string fileName) 
    { 
     File.Delete(fileName); 
    } 
} 

class MyRealCode 
{ 
    private IFileService _fileService; 
    public MyRealCode(IFileService fileService) 
    { 
     _fileService = fileService; 
    } 
    void DoStuff() 
    { 
     _fileService.Exists("myfile.txt"); 
    } 
} 
1

Ngoài bạn không thể giả lập câu trả lời dễ dàng.

Tôi muốn chỉ ra rằng bạn không nên chế nhạo loại tệp File.IO, vì đó không phải là loại mà bạn sở hữu. Bạn nên only Mock types that you own.

3

Xem thêm Vadim 's SystemWrapper. Bạn có thể giả lập a lot of system classes với nó, nhưng bạn sẽ cần phải áp dụng mẫu dependency injection để làm cho mã của bạn có thể kiểm tra.

[Test] 
public void Check_that_FileInfo_methods_Create_and_Delete_are_called() 
{ 
    // Add mock repository. 
    IFileInfoWrap fileInfoRepository = MockRepository.GenerateMock<IFileInfoWrap>(); 
    IFileStreamWrap fileStreamRepository = MockRepository.GenerateMock<IFileStreamWrap>(); 

    // Create expectations 
    fileInfoRepository.Expect(x => x.Create()).Return(fileStreamRepository); 
    fileStreamRepository.Expect(x => x.Close()); 
    fileInfoRepository.Expect(x => x.Delete()); 

    // Test 
    new FileInfoSample().CreateAndDeleteFile(fileInfoRepository); 

    // Verify expectations. 
    fileInfoRepository.VerifyAllExpectations(); 
    fileStreamRepository.VerifyAllExpectations(); 
} 
0

Bạn có thể sử dụng khung công tác moq cho this.It là dự án google nguồn mở mà bạn có thể tải xuống từ đây. Download Moq framework

Để hiểu đầy đủ về cách sử dụng moq với C#, vui lòng tham khảo bài viết sau.

http://learningcsharpe.blogspot.com/2011/11/how-to-use-moq-library-for-your-unit.html

cảm ơn, Erandika.

+1

Moq không thể kiểm tra các lớp tĩnh, xem http://stackoverflow.com/questions/12580015/how-to-mock-static-methods-in-c-sharp-using-moq-framework – guillem

1

Tôi cũng đã sử dụng các lớp trình bao bọc. Tôi sử dụng công cụ này để dễ dàng tạo ra các lớp wrapper như System.IO.File

https://www.nuget.org/packages/Digitrish.WrapperGenerator/

Khi bạn cài đặt các gói chỉ cần gõ lệnh sau đây trên Package Manager Console

Scaffold Wrapper System.IO.File

Điều này sẽ tạo ra giao diện IFile.cs và một lớp trình bao bọc concreate File.cs. Sau đó, bạn có thể sử dụng IFile để Mock và File.cs để thực hiện thực.

1

Tại sao không sử dụng MS Fakes? Nó sẽ không đơn giản, đã được hỗ trợ so với RhinoMocks, SystemWrapper.Wrapper và SystemWrapper.Interface?

+0

MS Fakes là một doanh nghiệp chỉ VS tính năng, từ những gì tôi hiểu. –

+1

Lưu ý rằng MS Fakes có sẵn từ năm 2012 VS, ông đã đăng câu hỏi trước đó! Có những nốt ruồi MS trước nhưng không chắc chắn về giới hạn của nó. –