2010-11-05 31 views
12

tôi có các bài kiểm tra folowing:Làm thế nào để đọc App.Config UnitTest dự án Từ thử nghiệm Với HOSTTYPE ("Nốt ruồi")

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

    [TestMethod] 
    [HostType("Moles")] 
    public void VerifyAppDomainHasConfigurationSettingsMoles() 
    { 
     string value = ConfigurationManager.AppSettings["TestValue"]; 
     Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found."); 
    } 
} 

Sự khác biệt duy nhất giữa họ là [HostType("Moles")]. Nhưng những người đầu tiên vượt qua và lần thứ hai thất bại. Làm thế nào tôi có thể đọc App.config từ bài kiểm tra thứ hai?

Hoặc có thể tôi có thể thêm một số tệp cấu hình khác ở nơi khác không?

+0

Một cách giải quyết tuyệt vời đã được gửi đến câu hỏi tương tự của tôi: http://stackoverflow.com/questions/9117248/cant-access-information-from-configuration-files-when-tests-have-host-type -mol –

+0

Tôi tìm thấy câu trả lời này: http://stackoverflow.com/a/6151688/13390 là cách tốt nhất để thay đổi tệp cấu hình khi sử dụng nốt ruồi. Nó hoạt động rất đẹp nếu bạn sử dụng các phần cấu hình tùy chỉnh (thực ra, nó là phần duy nhất hoạt động trong trường hợp đó). –

Trả lời

6

Xem http://social.msdn.microsoft.com/Forums/en/pex/thread/9b4b9ec5-582c-41e8-8b9c-1bb9457ba3f6

Trong lúc này, như một công trình xung quanh, bạn có thể thử thêm các thiết lập cấu hình để Microsoft.Moles.VsHost.x86.exe.config

+3

Theo liên kết, đó là lỗi và đang được thực hiện. Chỉ cần như vậy ppl không phải đi qua đó và đọc các chủ đề. – jcollum

+0

Điều này thực sự hút. Chúng tôi có một số thử nghiệm tích hợp trong đó (cho tốt hơn hoặc tồi tệ hơn) app.config thử nghiệm thực sự là khá lớn. Tôi đang mắc kẹt reimplementing ConfigurationManager/WebConfigurationManager. – BFree

5
[ClassInitialize] 
    public static void MyClassInitialize(TestContext testContext) 
    { 
     System.Configuration.Moles.MConfigurationManager.GetSectionString = 
      (string configurationName) => 
       { 
        ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); 
        Assembly assembly = Assembly.GetExecutingAssembly(); 
        fileMap.ExeConfigFilename = assembly.Location + ".config"; 
        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 
        object section = config.GetSection(configurationName); 
        if (section is DefaultSection) 
        { 
         ConfigurationSection configurationSection = (ConfigurationSection) section; 
         Type sectionType = Type.GetType(configurationSection.SectionInformation.Type); 
         if (sectionType != null) 
         { 
          IConfigurationSectionHandler sectionHandler = 
           (IConfigurationSectionHandler)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(sectionType.Assembly.FullName, sectionType.FullName); 
          section = 
           sectionHandler.Create(
            configurationSection.SectionInformation.GetParentSection(), 
            null, 
            XElement.Parse(configurationSection.SectionInformation.GetRawXml()).ToXmlNode()); 
         } 
        } 

        return section; 
       }; 
    } 
+1

Có vẻ đầy hứa hẹn mô hình này của ConfigurationManager, nhưng nếu tôi sử dụng để có được một appSetting, lỗi sau xảy ra: 'System.Configuration.ConfigurationErrorsException: phần cấu hình' appSettings 'có một khai báo bất ngờ'. Bất kỳ sửa chữa về điều này? – Dennis

+0

@Dennis, để khắc phục lỗi đó, hãy xem mã mẫu tại đây: http://social.msdn.microsoft.com/Forums/is/pex/thread/9b4b9ec5-582c-41e8-8b9c-1bb9457ba3f6 Nếu bạn không không có bất kỳ appSettings tùy chỉnh nào, bạn chỉ có thể "trả về NameValueCollection mới();" –

2

tôi chạy qua đây vấn đề tại nơi làm việc và không thích bất kỳ câu trả lời nào trong số này. Tôi cũng có vấn đề là tập tin cấu hình đang được đọc trong một hàm dựng tĩnh có nghĩa là tôi không thể Mole ConfigurationManager trước khi hàm tạo tĩnh được thực hiện.

Tôi đã thử điều này trên máy tính ở nhà và thấy rằng tệp cấu hình đã được đọc chính xác. Hóa ra tôi đã sử dụng Pex 0.94.51006.1 ở nhà. Điều này hơi lớn hơn so với hiện tại. Tôi có thể tìm bản tải xuống cho phiên bản cũ hơn: http://research.microsoft.com/en-us/downloads/d2279651-851f-4d7a-bf05-16fd7eb26559/default.aspx

Tôi đã cài đặt ứng dụng này trên máy tính của mình và mọi thứ hoạt động hoàn hảo. Tại thời điểm này, tôi đang hạ cấp xuống phiên bản cũ hơn cho đến khi một phiên bản làm việc mới hơn được phát hành.

+0

Chào mừng bạn đến với Stack Overflow. Đây là một trang hỏi đáp, không phải là một diễn đàn điển hình, vì vậy việc đăng câu hỏi như một phần của câu trả lời của bạn sẽ không thu hút sự chú ý đúng đắn, cũng không thích hợp cho trang web, vì câu trả lời cho câu hỏi được cho là chỉ giải quyết câu hỏi đó . Thông thường tôi khuyên bạn nên đăng câu hỏi của mình một cách riêng biệt, nhưng hỏi liệu một công cụ vẫn đang được phát triển là không có chủ đề ở đây hay không. Đó là câu hỏi hay nhất dành cho các nhà phát triển của công cụ. Cảm ơn. –

17

Giả sử bạn đang cố gắng truy cập các giá trị trong appSettings, chỉ cần thêm cấu hình vào đầu thử nghiệm của bạn. Một cái gì đó như:

ConfigurationManager.AppSettings["Key"] = "Value"; 

Sau đó, khi thử nghiệm của bạn cố gắng đọc AppSettings "Key", "Value" sẽ được trả lại.

+0

Ôi trời. Nếu nó tùy thuộc vào tôi, tôi sẽ làm cho câu trả lời này được chấp nhận !!! Cảm ơn bạn rất nhiều. Đó là một khoảnh khắc như vậy. lolz – pqsk

+3

Chỉ muốn thêm vào bất kỳ ai quan tâm đến việc thêm chuỗi kết nối có một chút khác biệt: ConfigurationManager.ConnectionStringsThêm (new ConnectionStringSettings ("name", "connectionstring"); – pqsk

+0

Cảm ơn, Kipp :) –

0

Đây là những gì tôi đang sử dụng để có được đúng AppConfig và ConnectionString phần:

var config = System.Configuration.ConfigurationManager.OpenExeConfiguration(Reflection.Assembly.GetExecutingAssembly().Location); 

typeof(Configuration.ConfigurationElementCollection).GetField("bReadOnly", Reflection.BindingFlags.Instance | Reflection.BindingFlags.NonPublic).SetValue(System.Configuration.ConfigurationManager.ConnectionStrings, false); 
foreach (Configuration.ConnectionStringSettings conn in config.ConnectionStrings.ConnectionStrings) 
    System.Configuration.ConfigurationManager.ConnectionStrings.Add(conn); 

foreach (Configuration.KeyValueConfigurationElement conf in config.AppSettings.Settings) 
    System.Configuration.ConfigurationManager.AppSettings(conf.Key) = conf.Value; 

Saw phần ConnectionString here

11

Bạn chỉ cần thêm "App.Config" tập tin của bạn cho dự án đơn vị thử nghiệm . Nó sẽ tự động đọc.

+3

Đôi khi các giải pháp đơn giản nhất là tốt nhất - điều này làm việc cho tôi thay vì tất cả các faffing xung quanh với OpenExeConfiguration và tương tự ... – noonand

+0

Nó không làm việc cho tôi: ( – cbillowes

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