โครงการทดสอบหน่วยสามารถโหลดไฟล์ app.config ของแอปพลิเคชันเป้าหมายได้หรือไม่


151

ฉันกำลังทดสอบแอปพลิเคชั่น. NET (.exe) ที่ใช้ไฟล์ app.config เพื่อโหลดคุณสมบัติการกำหนดค่า แอปพลิเคชันทดสอบหน่วยนั้นไม่มีไฟล์ app.config

เมื่อฉันพยายามที่จะทดสอบหน่วยวิธีการที่ใช้ใด ๆ ของคุณสมบัติการกำหนดค่าที่พวกเขากลับnull ฉันสมมติว่านี่เป็นเพราะแอปพลิเคชันทดสอบหน่วยจะไม่โหลดในแอปพลิเคชันเป้าหมายของแอป

มีวิธีการแทนที่นี้หรือฉันต้องเขียนสคริปต์เพื่อคัดลอกเนื้อหาของ app.config เป้าหมายเพื่อ app.config ท้องถิ่น?

โพสต์นี้แบบถามคำถามนี้ แต่ผู้เขียนมองจากมุมที่แตกต่างกว่าฉันจริงๆ

แก้ไข:ฉันควรพูดถึงว่าฉันใช้ VS08 Team System สำหรับการทดสอบหน่วยของฉัน

คำตอบ:


59

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการเพิ่ม.configไฟล์ในส่วนการปรับใช้ในการทดสอบหน่วยของคุณ

ในการทำเช่นนั้นให้เปิด.testrunconfigไฟล์จากรายการโซลูชันของคุณ ในส่วนการปรับใช้เพิ่ม.configไฟล์ผลลัพธ์จากไดเรกทอรีสร้างของโครงการของคุณ (สันนิษฐานbin\Debug)

สิ่งที่แสดงรายการในส่วนการปรับใช้จะถูกคัดลอกไปยังโฟลเดอร์การทำงานของโครงการทดสอบก่อนที่การทดสอบจะทำงานดังนั้นรหัสที่ขึ้นกับการกำหนดค่าของคุณจะทำงานได้ดี

แก้ไข: ฉันลืมเพิ่มซึ่งจะไม่ทำงานในทุกสถานการณ์ดังนั้นคุณอาจต้องรวมสคริปต์เริ่มต้นที่เปลี่ยนชื่อเอาต์พุต.configเพื่อให้ตรงกับชื่อของการทดสอบหน่วย


9
มันง่ายกว่ามากที่จะเพิ่มแอพกำหนดค่าความรู้สึกเข้ากับโครงการทดสอบจากนั้นคุณไม่จำเป็นต้องใช้ไฟล์. testrunconfig เลย
Rowland Shaw

13
@Rowland ถ้าคุณทำเช่นนั้นคุณต้องเก็บ app.config ไว้สองชุด ฉันควรจะใช้เวลา 10 วินาทีในครั้งเดียวโดยใช้เครื่องมือ .estrunconfig แทนที่จะต้องจำให้อัปเดตแอพในตำแหน่งทั้งสอง
Jeromy Irvine

66
คุณไม่สามารถเพิ่มการอ้างอิงที่ไม่ใช่การคัดลอกได้ใช่ไหม (เพิ่มรายการที่มีอยู่ ... )
EFraim

6
ความคิดเห็นของ EFraim ควรเป็นคำตอบที่ยอมรับได้ซึ่งง่ายกว่าสิ่งอื่นมาก
reggaeguitar

28
สำหรับโซลูชันของ EFraim: อย่าลืมใช้ "เพิ่มเป็นลิงค์" จากปุ่มคำสั่ง มิฉะนั้นคุณยังคงได้รับสำเนา นอกจากนี้แม้ว่าคำถามจะใช้สำหรับแอป. Net โดยเฉพาะ แต่สิ่งนี้จะไม่สามารถใช้ได้กับเว็บแอปเนื่องจากการตั้งค่าของแอปพลิเคชันเว็บมีชื่อผิด (Web.Config ไม่ใช่ App.Config)
Rob Von Nesselrode

103

ใน Visual Studio 2008 ฉันเพิ่มapp.configไฟล์ลงในโครงการทดสอบเป็นรายการที่มีอยู่และคัดลอกเป็นลิงค์เพื่อให้แน่ใจว่ามันไม่ได้ซ้ำกัน ด้วยวิธีนี้ฉันมีเพียงหนึ่งสำเนาในโซลูชันของฉัน ด้วยโครงการทดสอบหลายโครงการมันมีประโยชน์มากจริงๆ!

เพิ่มรายการที่มีอยู่

เพิ่มเป็นลิงค์


7
คำตอบที่สมบูรณ์แบบเรียบง่ายและมีวัตถุประสงค์! +1
Custodio

2
นี่เป็นทางออกที่ดีที่สุดและควรทำเครื่องหมายเป็นคำตอบ
niaher

4
สำหรับการเพิ่มรายการที่มีอยู่ "เป็นลิงค์" คุณควร: "ในกล่องโต้ตอบเพิ่มรายการที่มีอยู่ค้นหาและเลือกรายการโครงการที่คุณต้องการเชื่อมโยง" จากนั้น: "จากรายการดรอปดาวน์ของปุ่มเปิดให้เลือกเพิ่มเป็นลิงค์ "
uriel

มันใช้งานได้ดีสำหรับฉัน ฉันพยายามคิดถึงสถานการณ์ที่มันไม่ทำงาน ... และตอนนี้ฉันก็คิดพอแล้ว ขอบคุณ!
Dudeman3000

53

ไม่ว่าคุณจะใช้การทดสอบระบบทีมหรือNUnitแนวทางปฏิบัติที่ดีที่สุดคือการสร้างไลบรารีคลาสแยกต่างหากสำหรับการทดสอบของคุณ เพียงแค่เพิ่ม App.config กับโครงการทดสอบของคุณจะได้รับการคัดลอกไปยังโฟลเดอร์ bin ของคุณโดยอัตโนมัติเมื่อคุณรวบรวม

หากรหัสของคุณพึ่งพาการทดสอบการกำหนดค่าเฉพาะการทดสอบครั้งแรกที่ฉันจะเขียนจะตรวจสอบว่าไฟล์การกำหนดค่านั้นมีอยู่ ( เพื่อให้ฉันรู้ว่าฉันไม่ได้บ้า ):

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

และการทดสอบ:

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

เป็นการดีที่คุณควรจะเขียนโค้ดเพื่อให้วัตถุการกำหนดค่าของคุณถูกส่งผ่านไปยังคลาสของคุณ สิ่งนี้ไม่เพียง แต่แยกคุณออกจากปัญหาไฟล์กำหนดค่า แต่ยังช่วยให้คุณสามารถเขียนการทดสอบสำหรับสถานการณ์การกำหนดค่าต่างๆ

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
ฉันเห็นด้วยกับจิตวิญญาณของการผ่านในการพึ่งพาการกำหนดค่าที่นี่ดูเหมือนว่าจะได้รับการตอบโดย Mark Seemann ไม่น้อย! ที่นี่: การทดสอบหน่วยล้มเหลวเนื่องจากไฟล์. config ขาดหายไป
Shaun

มี "หายไปจากบรรทัด: ค่าสตริง = ConfigurationManager.AppSettings [" TestValue]; ฉันพยายามที่จะแก้ไข แต่จะต้องค้นหาตัวละครอีก 5 ตัวเพื่อแก้ไขเพื่อให้ได้สแต็คโอเวอร์โฟลว์เพื่อให้ฉันทำการแก้ไข
Jane

22

หากคุณมีโซลูชันที่มีตัวอย่างเช่นแอปพลิเคชันเว็บและโครงการทดสอบคุณอาจต้องการให้โครงการทดสอบใช้ web.config ของแอปพลิเคชันเว็บ

วิธีหนึ่งในการแก้ไขคือคัดลอก web.config เพื่อทดสอบโครงการและเปลี่ยนชื่อเป็น app.config

อีกวิธีที่ดีกว่าคือการปรับเปลี่ยนการสร้างโซ่และทำสำเนาของ web.config อัตโนมัติเพื่อทดสอบไดเรกทอรีผลลัพธ์ของโครงการ โดยคลิกขวาที่ทดสอบแอปพลิเคชันแล้วเลือกคุณสมบัติ ตอนนี้คุณควรเห็นคุณสมบัติของโครงการ คลิก "สร้างกิจกรรม" จากนั้นคลิกปุ่ม "แก้ไขโพสต์บิลด์ ... " เขียนบรรทัดต่อไปนี้:

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

และคลิกตกลง (หมายเหตุคุณอาจต้องเปลี่ยน WebApplication1 เป็นชื่อโครงการที่คุณต้องการทดสอบ) หากคุณมีเส้นทางที่ผิดไปยัง web.config การคัดลอกล้มเหลวและคุณจะสังเกตเห็นมันในระหว่างการสร้างไม่สำเร็จ

แก้ไข:

วิธีคัดลอกจากโครงการปัจจุบันไปยังโครงการทดสอบ:

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

ทางออกที่ดีจริงๆ สิ่งนี้ช่วยให้ฉันหลีกเลี่ยงการคัดลอกและทำซ้ำ.configไฟล์ ขอบคุณสำหรับการแบ่งปัน! :)
Leniel Maccaferri

ทางออกที่ดีมาก! ขอบคุณมาก.
Vin Shahrdar

วิธีแก้ปัญหาที่ดี แต่สิ่งที่เกิดขึ้นเมื่อหลักweb.configมีการอ้างอิงไปยัง.configไฟล์ภายนอกภายในโครงการเดียวกัน เนื่องจากพา ธ สามารถชี้ไปที่โฟลเดอร์ภายในไดเรกทอรีเดียวกัน (ซึ่งเป็นจริงตามปกติ) เมื่อเรียกใช้การทดสอบจึงไม่สามารถจัดการไฟล์ภายนอกเหล่านั้นได้ ความคิดวิธีการแก้ปัญหาใด ๆ
Sugafree

สิ่งนี้ใช้ได้กับฉัน: คัดลอก "$ (SolutionDir) \ MainProject \ Web.config" "$ (ProjectDir) app.config"
แอนดรูว์

8

มันค่อนข้างเก่า แต่ฉันก็พบทางออกที่ดีกว่าสำหรับเรื่องนี้ ฉันลองคำตอบที่เลือกไว้ที่นี่ แต่ดูเหมือนว่า .estrunconfig ล้าสมัยไปแล้ว

1. สำหรับการทดสอบหน่วยให้ตัดการกำหนดค่าเป็นส่วนต่อประสาน (IConfig)

สำหรับการทดสอบหน่วยการกำหนดค่าไม่ควรเป็นส่วนหนึ่งของการทดสอบของคุณดังนั้นสร้างจำลองที่คุณสามารถฉีดได้ ในตัวอย่างนี้ฉันใช้ Moq

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

2. สำหรับการทดสอบการรวมให้เพิ่มการกำหนดค่าที่คุณต้องการแบบไดนามิก

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

มันง่ายมาก

  • คลิกขวาที่โครงการทดสอบของคุณ
  • เพิ่ม -> รายการที่มีอยู่
  • คุณสามารถเห็นลูกศรเล็ก ๆ ข้างปุ่มเพิ่ม
  • เลือกไฟล์กำหนดค่าคลิกที่ "เพิ่มเป็นลิงค์"

4

หากคุณกำลังใช้ NUnit ลองดูที่โพสต์นี้ โดยทั่วไปคุณจะต้องมี app.config ในไดเรกทอรีเดียวกับไฟล์ .unit ของคุณ


ฉันใช้ VS08 Team System สำหรับการทดสอบหน่วยของฉัน แต่ขอบคุณสำหรับเคล็ดลับ NUnit!
Jordan Parmer

2

หากแอปพลิเคชันของคุณกำลังใช้การตั้งค่าเช่น Asp.net ConnectionString คุณต้องเพิ่มแอตทริบิวต์ HostType ให้กับวิธีการของคุณมิฉะนั้นจะไม่โหลดแม้ว่าคุณจะมีไฟล์ App.Config

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

}

0

ฉันใช้NUnitและในไดเรกทอรีโครงการของฉันฉันมีสำเนาของ App.Config ที่ฉันเปลี่ยนการกำหนดค่าบางอย่าง (ตัวอย่างฉันเปลี่ยนเส้นทางไปยังฐานข้อมูลทดสอบ ... ) คุณต้องมีมันในไดเรกทอรีเดียวกันของโครงการทดสอบและคุณจะไม่เป็นไร


0

ฉันไม่สามารถรับคำแนะนำเหล่านี้เพื่อทำงานกับ nUnit 2.5.10 ดังนั้นฉันจึงลงเอยด้วยการใช้งานโครงการของ nUnit -> แก้ไขการทำงานเพื่อระบุไฟล์ปรับแต่งที่จะกำหนดเป้าหมาย (อย่างที่คนอื่นบอกว่าต้องอยู่ในโฟลเดอร์เดียวกันกับ nunit ยื่นเอง) ด้านบวกของสิ่งนี้คือฉันสามารถตั้งชื่อไฟล์ Test.config ซึ่งทำให้ชัดเจนมากขึ้นว่ามันคืออะไรและทำไมมันเป็น)


0

การทดสอบหน่วยของคุณถือเป็นสภาพแวดล้อมที่ใช้รหัสของคุณเพื่อทดสอบ เช่นเดียวกับสภาพแวดล้อมปกติคุณมีการจัดเตรียม / การผลิต คุณอาจต้องเพิ่ม.configไฟล์สำหรับโครงการทดสอบของคุณเช่นกัน วิธีแก้ปัญหาคือการสร้างไลบรารีคลาสและแปลงเป็นโครงการทดสอบโดยการเพิ่มแพ็คเกจ NuGet ที่จำเป็นเช่น NUnit และ NUnit Adapter มันทำงานได้อย่างสมบูรณ์แบบด้วย Visual Studio Test Runner และ Resharper และคุณมีapp.configไฟล์ของคุณในโครงการทดสอบของคุณ ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

และในที่สุด debugged การทดสอบและค่าของฉันจากApp.config:

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.