Dự án thử nghiệm đơn vị có thể tải tệp app.config của ứng dụng đích không?


150

Tôi đang kiểm tra đơn vị ứng dụng .NET (.exe) sử dụng tệp app.config để tải các thuộc tính cấu hình. Bản thân ứng dụng kiểm tra đơn vị không có tệp app.config.

Khi tôi cố gắng kiểm tra đơn vị một phương thức sử dụng bất kỳ thuộc tính cấu hình nào, chúng sẽ trả về null . Tôi cho rằng điều này là do ứng dụng thử nghiệm đơn vị sẽ không tải trong app.config của ứng dụng đích.

Có cách nào để ghi đè lên điều này hay tôi phải viết một tập lệnh để sao chép nội dung của app.config đích vào một app.config cục bộ?

Bài đăng này loại câu hỏi này nhưng tác giả thực sự đang nhìn nó từ một góc độ khác với tôi.

EDIT: Tôi nên đề cập rằng tôi đang sử dụng Hệ thống nhóm VS08 cho các bài kiểm tra đơn vị của mình.

Câu trả lời:


59

Cách đơn giản nhất để làm điều này là thêm .configtệp trong phần triển khai trong bài kiểm tra đơn vị của bạn.

Để làm như vậy, hãy mở .testrunconfigtệp từ Mục Giải pháp của bạn. Trong phần Triển khai, thêm các .configtệp đầu ra từ thư mục xây dựng dự án của bạn (có lẽ bin\Debug).

Bất cứ điều gì được liệt kê trong phần triển khai sẽ được sao chép vào thư mục làm việc của dự án thử nghiệm trước khi các thử nghiệm được chạy, do đó mã phụ thuộc cấu hình của bạn sẽ chạy tốt.

Chỉnh sửa: Tôi quên thêm, điều này sẽ không hoạt động trong mọi tình huống, vì vậy bạn có thể cần bao gồm một tập lệnh khởi động đổi tên đầu ra .configđể khớp với tên của bài kiểm tra đơn vị.


9
Thật dễ dàng hơn nhiều khi chỉ cần thêm một app.config fiel vào dự án thử nghiệm - sau đó bạn không cần phải chơi xung quanh với .testrunconfig.
Rowland Shaw

13
@Rowland nếu bạn làm điều đó, bạn phải duy trì hai bản sao của app.config. Tôi thà dành 10 giây, một lần, bằng cách sử dụng công cụ .testrunconfig hơn là phải nhớ cập nhật app.config ở cả hai nơi.
Jeromy Irvine

66
Bạn có thể chỉ cần thêm một tài liệu tham khảo không sao chép? (Thêm mục hiện có ...)
EFraim

6
Nhận xét của EFraim nên là câu trả lời được chấp nhận, điều này đơn giản hơn nhiều so với bất kỳ điều gì khác.
reggaeg Ức

28
Đối với solen của EFraim: Đảm bảo sử dụng "Thêm dưới dạng liên kết" từ nút lệnh. Nếu không bạn vẫn nhận được một bản sao. Ngoài ra, mặc dù câu hỏi dành riêng cho ứng dụng .Net, nhưng câu hỏi này sẽ không hoạt động đối với ứng dụng web vì cấu hình của ứng dụng web có tên sai (Web.Config, không phải App.Config)
Rob Von Nesselrode

103

Trong Visual Studio 2008, tôi đã thêm app.configtệp vào dự án thử nghiệm dưới dạng một mục hiện có và chọn bản sao làm liên kết để đảm bảo nó không bị trùng lặp. Bằng cách đó tôi chỉ có một bản sao trong giải pháp của mình. Với một số dự án thử nghiệm, nó thực sự tiện dụng!

Thêm mục hiện có

Thêm dưới dạng liên kết


7
Câu trả lời hoàn hảo, đơn giản và khách quan! +1
Custodio

2
Đây là giải pháp tốt nhất và nên được đánh dấu là câu trả lời.
niaher

4
Để thêm mục hiện có "dưới dạng liên kết", bạn nên: "Trong hộp thoại Thêm mục hiện có, xác định vị trí và chọn mục dự án bạn muốn liên kết", sau đó: "Từ danh sách thả xuống nút Mở, chọn Thêm dưới dạng liên kết. "
uriel 17/05/2015

Nó hiệu quả tuyệt vời đối với tôi. Tôi đang cố gắng nghĩ về một tình huống mà nó sẽ không hoạt động ... Và tôi đã nghĩ đủ rồi. Cảm ơn!
Dudeman3000

53

Cho dù bạn đang sử dụng Team System Test hay NUnit , cách tốt nhất là tạo Thư viện lớp riêng cho các bài kiểm tra của bạn. Chỉ cần thêm một App.config vào dự án thử nghiệm của bạn sẽ tự động được sao chép vào thư mục bin của bạn khi bạn biên dịch .

Nếu mã của bạn phụ thuộc vào các kiểm tra cấu hình cụ thể, thử nghiệm đầu tiên tôi sẽ viết xác nhận rằng tệp cấu hình có sẵn ( để tôi biết tôi không điên ):

<configuration>
   <appSettings>
       <add key="TestValue" value="true" />
   </appSettings>
</configuration>

Và bài kiểm tra:

[TestFixture]
public class GeneralFixture
{
     [Test]
     public void VerifyAppDomainHasConfigurationSettings()
     {
          string value = ConfigurationManager.AppSettings["TestValue"];
          Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found.");
     }
}

Tốt nhất, bạn nên viết mã sao cho các đối tượng cấu hình của bạn được truyền vào các lớp của bạn. Điều này không chỉ tách bạn khỏi vấn đề tập tin cấu hình mà còn cho phép bạn viết các bài kiểm tra cho các kịch bản cấu hình khác nhau.

public class MyObject
{
     public void Configure(MyConfigurationObject config)
     {
          _enabled = config.Enabled;
     }

     public string Foo()
     {
         if (_enabled)
         {
             return "foo!";
         }
         return String.Empty;
     }

     private bool _enabled;
}

[TestFixture]
public class MyObjectTestFixture
{
     [Test]
     public void CanInitializeWithProperConfig()
     {
         MyConfigurationObject config = new MyConfigurationObject();
         config.Enabled = true;

         MyObject myObj = new MyObject();
         myObj.Configure(config);

         Assert.AreEqual("foo!", myObj.Foo());
     }
}

2
Tôi đồng ý với tinh thần vượt qua trong sự phụ thuộc cấu hình ở đây, điều này dường như đã được trả lời, bởi Mark Seemann không hơn không kém! ở đây: Không kiểm tra đơn vị do thiếu tệp .config
Shaun

Có một "thiếu từ dòng: chuỗi value = ConfigurationManager.AppSinstall [" TestValue]; Tôi đã cố gắng sửa nó, nhưng sẽ phải tìm thêm 5 ký tự để sửa để có được stackoverflow để cho phép tôi thực hiện chỉnh sửa.
Jane

22

Nếu bạn có một giải pháp có chứa Dự án thử nghiệm và Ứng dụng web, bạn có thể muốn Dự án thử nghiệm sử dụng web.config của Ứng dụng web.

Một cách để giải quyết nó là sao chép web.config để kiểm tra dự án và đổi tên nó thành app.config.

Một giải pháp khác và tốt hơn là sửa đổi chuỗi xây dựng và làm cho nó tạo bản sao tự động của web.config để kiểm tra thư mục đầu ra của dự án. Để làm điều đó, nhấp chuột phải vào Ứng dụng thử nghiệm và chọn thuộc tính. Bây giờ bạn sẽ thấy các thuộc tính dự án. Nhấp vào "Xây dựng sự kiện" và sau đó nhấp vào nút "Chỉnh sửa hậu xây dựng ...". Viết dòng sau đây:

copy "$(SolutionDir)\WebApplication1\web.config" "$(ProjectDir)$(OutDir)$(TargetFileName).config"

Và nhấn OK. (Lưu ý bạn có lẽ cần thay đổi WebApplication1 như tên dự án mà bạn muốn kiểm tra). Nếu bạn có đường dẫn sai đến web.config thì sao chép thất bại và bạn sẽ nhận thấy nó trong quá trình xây dựng không thành công.

Biên tập:

Để sao chép từ Dự án hiện tại sang Dự án thử nghiệm:

copy "$(ProjectDir)bin\WebProject.dll.config" "$(SolutionDir)WebProject.Tests\bin\Debug\App.Config"

Giải pháp thực sự tốt đẹp. Điều này giúp tôi tránh sao chép và sao chép .configcác tập tin. Cám ơn vì đã chia sẻ! :)
Leniel Maccaferri

Giải pháp rất hay! Cảm ơn rất nhiều.
Vin Shahrdar

Giải pháp tốt, nhưng điều gì xảy ra khi chính web.configchỉ có tham chiếu đến các .configtệp bên ngoài trong cùng một dự án. Vì đường dẫn chỉ có thể trỏ đến các thư mục trong cùng một thư mục (điều này đúng thông thường), khi chạy thử nghiệm, nó sẽ không thể xử lý các tệp bên ngoài đó. Bất kỳ ý tưởng làm thế nào để giải quyết nó?
Sugafree

Điều này hiệu quả với tôi: sao chép "$ (SolutionDir) \ MainProject \ Web.config" "$ (ProjectDir) app.config"
Andrew

8

Điều này hơi cũ nhưng tôi tìm thấy một giải pháp tốt hơn cho việc này. Tôi đã thử câu trả lời được chọn ở đây nhưng có vẻ như .testrunconfig đã lỗi thời.

1. Đối với Kiểm tra đơn vị, Gói cấu hình là Giao diện (IConfig)

đối với các bài kiểm tra Đơn vị, cấu hình thực sự không nên là một phần của những gì bài kiểm tra của bạn để tạo ra một bản giả mà bạn có thể tiêm. Trong ví dụ này tôi đã sử dụng Moq.

Mock<IConfig> _configMock;
_configMock.Setup(config => config.ConfigKey).Returns("ConfigValue");
var SUT = new SUT(_configMock.Object);

2. Đối với kiểm tra Tích hợp, tự động thêm cấu hình bạn cần

Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if(config.AppSettings.Settings[configName] != null)
{
    config.AppSettings.Settings.Remove(configName);
}
config.AppSettings.Settings.Add(configName, configValue);
config.Save(ConfigurationSaveMode.Modified, true);
ConfigurationManager.RefreshSection("appSettings");

5

Nó rất là dễ.

  • Nhấp chuột phải vào dự án thử nghiệm của bạn
  • Thêm -> Mục hiện có
  • Bạn có thể thấy một mũi tên nhỏ ngay bên cạnh nút Thêm
  • Chọn tệp cấu hình, nhấp vào "Thêm dưới dạng liên kết"

4

Nếu bạn đang sử dụng NUnit, hãy xem bài viết này . Về cơ bản, bạn sẽ cần phải có app.config trong cùng thư mục với tệp .nunit của bạn.


Tôi đang sử dụng Hệ thống nhóm VS08 cho các bài kiểm tra đơn vị của mình nhưng cảm ơn vì mẹo NUnit!
Jordan Parmer

2

Nếu ứng dụng của bạn đang sử dụng cài đặt như Asp.net ConnectionString, bạn cần thêm thuộc tính HostType vào phương thức của mình, nếu không chúng sẽ không tải ngay cả khi bạn có tệp App.Config.

[TestMethod]
[HostType("ASP.NET")] // will load the ConnectionString from the App.Config file
public void Test() {

}

0

Tôi sử dụng NUnit và trong thư mục dự án của tôi, tôi có một bản sao App.Config của mình để thay đổi một số cấu hình (ví dụ tôi chuyển hướng đến cơ sở dữ liệu thử nghiệm ...). Bạn cần phải có nó trong cùng thư mục của dự án đã thử nghiệm và bạn sẽ ổn.


0

Tôi không thể nhận được bất kỳ đề xuất nào trong số các đề xuất này để hoạt động với nUnit 2.5.10 vì vậy tôi đã kết thúc bằng cách sử dụng Project của nUnit -> Chỉnh sửa chức năng để chỉ định tệp cấu hình cần nhắm mục tiêu (như những người khác đã nói rằng nó cần phải nằm trong cùng thư mục với. tập tin nunit). Mặt tích cực của điều này là tôi có thể đặt cho tệp cấu hình một tên Test.config để làm cho nó rõ ràng hơn nhiều và tại sao nó là)


0

Kiểm tra đơn vị của bạn được coi là một môi trường chạy mã của bạn để kiểm tra nó. Cũng giống như bất kỳ môi trường bình thường, bạn có nghĩa là dàn dựng / sản xuất. Bạn có thể cần phải thêm một .configtệp cho dự án thử nghiệm của bạn. Cách giải quyết là tạo một thư viện lớp và chuyển đổi nó thành Test Project bằng cách thêm các gói NuGet cần thiết như NUnit và NUnit Adaptor. nó hoạt động hoàn toàn tốt với cả Visual Studio Test Runner và Resharper và bạn có app.configtệp của mình trong dự án thử nghiệm. nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Và cuối cùng đã gỡ lỗi bài kiểm tra và giá trị của tôi từ App.config:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.