2009-10-08 30 views
22

Mục tiêu là chạy một số thử nghiệm được cung cấp một số dữ liệu trong các tệp Xml đó.Visual Studio - Kiểm tra đơn vị tải tài nguyên trong dự án

Bạn sẽ dễ dàng tải một tệp Xml đã cho vào XmlDoc trong các phương pháp thử nghiệm đơn vị như thế nào?

nhà nước hiện hành là:

XmlDocument doc = new XmlDocument(); 
    string xmlFile = "4.xml"; 
    string dir = System.IO.Directory.GetCurrentDirectory() + @"\Msgs\" 

    //dir is then the value of the current exe's path, which is 
    //d:\sourcecode\myproject\TestResults\myComputer 2009-10-08 16_07_45\Out 

    //we actually need: 
    //d:\sourcecode\myproject\Msgs\ 
    doc.Load(dir + fileName); //should really use System.IO.Path.Combine()! 

là nó chỉ là một vấn đề đơn giản của việc đưa con đường đó trong một app.config? Tôi đã hy vọng tránh điều đó, với khả năng khả năng của các đường dẫn khác nhau trên các máy phát triển.

Câu hỏi: Bạn viết thuật toán để tải một tệp Xml đã cho vào XmlDocument trong phương pháp thử nghiệm đơn vị như thế nào?

Trả lời

9

Trong dự án thử nghiệm đơn vị thêm sự kiện sau khi xây dựng sao chép tệp XML vào thư mục đầu ra. Sau đó, bạn có thể sử dụng mã ban đầu của mình để lấy tệp XML.

Các bài build kiện này sẽ trông giống như một cái gì đó như thế này:

copy $(SolutionDir)file.xml $(ProjectDir)$(OutDir)file.xml 

Bạn cũng có thể cần điều này để thêm vào đường dẫn của bạn:

Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) 
+14

Tôi thấy rằng tập tin của tôi là sẽ "Project1_UnitTests \ bin \ Debug" trong khi thử nghiệm đang cố gắng tìm nó trong "TestResults \ Username_PCName_datetime \ Out" .. ??? – Greg

+0

trên 6 phiếu bầu trên bình luận của @ Greg, tôi đã chỉnh sửa câu trả lời này và thêm vào thông tin bổ sung để làm cho câu trả lời này hoàn chỉnh hơn. – javamonkey79

+1

@ javamonkey79 Điều đó không giúp java –

0

Tôi chỉ cần đặt đường dẫn trong app.config và tải từ đường dẫn mặc định. Trong nhóm của tôi, tôi thực sự hậu môn về các nhà phát triển thay đổi đường dẫn, vì vậy tôi làm cho tất cả các nhà phát triển của tôi có cùng đường dẫn và tệp chính xác trên máy tính của họ, vì vậy tôi không gặp vấn đề gì với bất kỳ nhà phát triển giả mạo nào đang thay đổi đường dẫn đến không gian làm việc của mình.

Ví dụ, tất cả các nhà phát triển trong nhóm của tôi phải sử dụng C: \ Project \ Product \ Module, v.v. Tôi cũng đảm bảo rằng tất cả các phần mềm của họ được cài đặt cũng là tiêu chuẩn. Bằng cách này, tôi có thể ma bất kỳ máy tính vào bất kỳ khác dễ dàng.

22

Bạn có thể tạo các tệp đó vào tệp thi hành của mình (đặt thuộc tính "Xây dựng tác vụ" thành "Tài nguyên được nhúng") và sau đó nhận chúng bằng cách sử dụng Assembly.GetManifestResourceStream method.

+0

Patrick Cauldwell có một bài viết thú vị về điều đó [http://www.cauldwell.net/patrick/blog/TestingWithExternalFiles.aspx](http://www.cauldwell.net/patrick/blog/TestingWithExternalFiles.aspx) –

4

tôi sử dụng một lớp helper để đối phó với việc cơ bản đường dẫn tôi có thể muốn truy cập trong Bài kiểm tra đơn vị của tôi.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Brass9.Testing 
{ 
    public static class TestHelper 
    { 
     public static string GetBinPath() 
     { 
      return System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); 
     } 

     public static string GetProjectPath() 
     { 
      string appRoot = GetBinPath(); 
      var dir = new DirectoryInfo(appRoot).Parent.Parent.Parent; 
      var name = dir.Name; 
      return dir.FullName + @"\" + name + @"\"; 
     } 

     public static string GetTestProjectPath() 
     { 
      string appRoot = GetBinPath(); 
      var dir = new DirectoryInfo(appRoot).Parent.Parent; 
      return dir.FullName + @"\"; 
     } 

     public static string GetMainProjectPath() 
     { 
      string testProjectPath = GetTestProjectPath(); 
      // Just hope it ends in the standard .Tests, lop it off, done. 
      string path = testProjectPath.Substring(0, testProjectPath.Length - 7) + @"\"; 
      return path; 
     } 
    } 
} 

Đôi khi tương tác của tôi với đường dẫn phức tạp hơn; Tôi thường sử dụng một lớp trung tâm mà tôi đặt tên là "App" để chỉ ra một số chi tiết cơ bản về ứng dụng, như thư mục gốc, không gian tên gốc và mô-đun, vv Các lớp đôi khi sẽ phụ thuộc vào sự tồn tại của ứng dụng. phương pháp trên ứng dụng sử dụng mã như trên để khởi tạo chính nó cho khai thác thử nghiệm, và gọi phương thức đó từ lệnh Init trong một bài kiểm tra đơn vị.

(Cập nhật)

Old trả lời

Tôi thấy điều này giúp cho việc đường dẫn tùy ý để truy cập tập tin trong thư mục dự án bạn có ý định để kiểm tra (như trái ngược với các file trong thư mục dự án thử nghiệm, có thể làm bận rộn nếu bạn cần sao chép mọi thứ).

DirectoryInfo projectDir = new DirectoryInfo(@"..\..\..\ProjectName"); 
string projectDirPath = projectDir.FullName; 

Sau đó, bạn có thể sử dụng một trong các biến đó để truy cập vào bất kỳ điều gì bạn cần từ dự án liên quan. Rõ ràng là hoán đổi "ProjectName" cho tên thật của dự án của bạn.

+0

Hoặc, nếu đường dẫn của bạn trông giống như "TestResults \ Username_PCName_datetime \ Out", bạn có thể sử dụng 'ProjectDir = new System.IO.DirectoryInfo (@" .. \ .. \ .. \ .. \ .. \ .. \ ProjectName ");' –

+0

Tôi đã gặp sự cố khi sử dụng phương pháp này. Một đường dẫn sẽ làm việc cho MS Test runner nhưng đối với những người chạy khác nó có thể không hoạt động.Ví dụ một số nhà phát triển đã sử dụng ** MS Test Runner ** và một số ** ReSharper ** và các đường dẫn thử nghiệm khác nhau (\ TestResults \\) và thất bại một hoặc cách khác. Cố định bởi một hack:/ –

24

Có một tính năng Studio Đơn vị kiểm tra trực quan cho việc này: DeploymentItemAttribute

tôi sử dụng tính năng này để sao chép tất cả các file xml trong một thư mục dự án trao cho các thư mục đầu ra đơn vị kiểm tra, trước khi thử nghiệm nếu tất cả các file cần thiết có mặt.

Bạn có thể sử dụng thuộc tính này với các bài kiểm tra đơn vị của bạn để sao chép các tệp cụ thể từ thư mục Project (hoặc bất kỳ nơi nào khác) vào thư mục đầu ra Test Unit. Cũng giống như vậy:

[TestMethod()] 
[DeploymentItem("MyProjectFolder\\SomeDataFolder\\somefile.txt", "SomeOutputSubdirectory")] 
public void FindResourcefile_Test() 
{ 
    string fileName = "SomeOutputSubdirectory\\somefile.txt"; 
    Assert.IsTrue(System.IO.File.Exists(fileName)); 
} 

Bạn cũng có thể sao chép nội dung của toàn bộ các thư mục:

[TestMethod()] 
[DeploymentItem("MyProjectFolder\\SomeDataFolder\\", "SomeOutputSubdirectory")] 
public void FindResourcefile_Test() 
{ 
    string fileName = "SomeOutputSubdirectory\\someOtherFile.txt"; 
    Assert.IsTrue(System.IO.File.Exists(fileName)); 
} 

Tham số đầu tiên là nguồn gốc, thứ hai thư mục đích. Nguồn này liên quan đến thư mục giải pháp của bạn (vì vậy bạn có thể truy cập vào dự án Thử nghiệm Đơn vị của dự án đang được thử nghiệm) và đích đến tương đối so với thư mục đầu ra của assembly thử nghiệm đơn vị.

UPDATE:

Bạn cần phải bật triển khai trong Cài đặt thử nghiệm để làm việc này. Trang MSDN này giải thích cách (thật dễ dàng): http://msdn.microsoft.com/en-us/library/ms182475(v=vs.90).aspx#EnableDisableDeploy

+0

Điều này không hoạt động với ** NUnit **. 'DeploymentItemAttribute' nằm trong' Microsoft.VisualStudio.TestTools.UnitTesting' – Jess

+0

Lưu ý rằng bạn phải đặt thuộc tính "copy to output" của tệp bạn muốn sử dụng: Chọn chúng trong Solution Explorer và đặt thuộc tính Copy to Output thành Copy nếu Mới hơn. Xem liên kết này: https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.deploymentitemattribute(v=vs.140).aspx – Allie

0

Tôi nghĩ rằng trong VS.NET 2012 thuộc tính DeploymentItem hoạt động mà không có bất kỳ cấu hình Cài đặt kiểm tra nào.

1

Tài nguyên chỉ là tài nguyên và đó là nó, không cần phải phức tạp. Nếu bạn không muốn nhúng chúng, bạn có thể thêm các tệp này dưới dạng tài nguyên "Nội dung" vào dự án của bạn và đặt chúng thành Copy always. Sau đó chỉ định thư mục con trong mã của bạn:

var xmlDoc = XElement.Load("ProjectSubFolder\\Resource.xml"); 

này sẽ tự động tải các nguồn lực từ đầu ra của dự án (chạy vị trí lắp ráp) bin\$(Configuration)\ResourceSubfolder\

này làm việc cho tất cả các loại dự án, không chỉ kiểm tra đơn vị.

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