2011-01-12 17 views
5

Tôi đang thử nghiệm một số mã cần sử dụng đối tượng FileInfo và DirectoryInfo và thay vì viết trình bao bọc và một số giao diện để giải quyết vấn đề này, Tôi nghĩ rằng nó sẽ là một ý tưởng tốt tạo ra một số tập tin khi bắt đầu thử nghiệm và sau đó xóa các tập tin sau khi thử nghiệm được thực hiện. Đây là cách tôi tạo các tệp:Tạo tệp trong khi kiểm tra đơn vị - không thể mở tệp để viết - TestDriven.Net và NUnit

public static void CreateTestSchedules(int quantity) 
{ 
    String folder = Path.Combine(Directory.GetCurrentDirectory(), "FolderFiles"); 
    for(int quantity=10; quantity > 0; quantity--) 
    { 
     String filename = Path.GetTempFileName(); 
     using (FileStream fileStream = File.Create(Path.Combine(folder, filename))) 
     { 
      XDocument fileContent = Helper.CreateContent(filename); 
      Byte[] bytes = ASCIIEncoding.ASCII.GetBytes(fileContent.ToString()); 

      fileStream.Write(bytes, 0, bytes.Length); 
      fileStream.Flush(); 
      fileStream.Close(); 
     } 
    } 
} 

Tại thời điểm này, tôi không thấy sự cố: tệp được tạo trong thư mục và mọi thứ đều ổn. Sau đó, khi thực hiện kiểm tra tiếp tục, tôi cố gắng mở một trong những tệp đó để viết một cái gì đó trong đó, và tôi nhận được một ngoại lệ cho biết tệp mà tôi muốn mở để viết đang được sử dụng bởi quá trình khác và , sau khi kiểm tra với nhiều chi tiết hơn, tôi thấy quá trình TestDriven.Net là quá trình chặn tệp. Đây là mã tôi sử dụng để mở và cố gắng ghi dữ liệu vào tệp:

using (FileStream file = new FileStream(filename, FileMode.Append)) 
{ 
    Byte[] bytes = ASCIIEncoding.ASCII.GetBytes(dataToWrite.ToString()); 
    if (file.CanWrite) 
    { 
     file.Write(bytes, 0, bytes.Length); 
    } 
} 

Câu hỏi của tôi là: tại sao điều này lại xảy ra? không phát hành tập tin đúng cách? có cách nào để lấy cắp khóa từ TestDriven.Net không? Tôi có nên tạo tệp này khác nhau không? tôi có nên viết bài kiểm tra theo cách khác không?

Cảm ơn trước cho câu trả lời và nhận xét =).

EDIT:

Để giải quyết NÀY vấn đề cụ thể (vấn đề REAL, như Dave Swersky đề cập đến nó, là các Unit Test KHÔNG NÊN Chạm vào hệ thống tập tin) tôi đã sử dụng các liên kết được gửi bởi James Wiseman (Cảm ơn James = một lần nữa) và tạo ra các tập tin với một lá cờ FileShare, theo cách đó tôi có thể tiếp cận vào tập tin, mở nó một ghi vào nó. Như thế này:

using (FileStream fileStream = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite, **FileShare.ReadWrite**)) 

Với điều đó tôi có thể mở và ghi vào tệp. =)

Trả lời

1

Tôi nhận thấy bạn đang sử dụng đối tượng FileStream trực tiếp để thực hiện việc ghi.

Có vấn đề tương tự nếu bạn tạo đối tượng StreamWriter và sử dụng đối tượng đó cho các thao tác tệp (bao gồm cả đóng)?

Tìm kiếm trên Google đã bật bài viết này. Bạn có thể thấy nó hữu ích. http://foson.blogspot.com/2007/10/closing-filestream-and-streamwriter-and.html

2

Đây có thể không phải là câu trả lời bạn đang tìm kiếm, nhưng đây chính xác là lý do bạn nên sử dụng mocks và không thực sự tạo tệp.

Đây là giải pháp sẵn sàng để chế nhạo hệ thống tệp: http://bugsquash.blogspot.com/2008/03/injectable-file-adapters.html

+1

Cảm ơn bạn đã trả lời/nhận xét. Bài viết thực sự thú vị và bạn nói đúng: Tôi không nên chạm vào hệ thống tập tin cho việc này. Như tôi đã nói, tôi nghĩ rằng tôi sẽ không phải là quá nhiều của một vấn đề bởi vì tôi đã tạo ra chúng (các tập tin) cho các tập tin và sau đó xóa chúng. Nếu tôi không thể khắc phục điều này một cách nhanh chóng cho lần lặp này, tôi nghĩ tôi sẽ phải thay đổi bài kiểm tra và mã của mình đang được kiểm tra. =) – Hugo

+0

Tôi phải thừa nhận tôi tìm cách tiếp cận IFile một chút khó chịu. Một giải pháp khác là http://systemioabstractions.codeplex.com –

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