C#: รันการทดสอบแต่ละหน่วยด้วยไฟล์การกำหนดค่าที่แตกต่างกัน

ขณะนี้ฉันกำลังพัฒนาปลั๊กอินเพื่อใช้ในแอปพลิเคชันใดๆ และการกำหนดค่าปลั๊กอินทำได้ผ่านการใช้ไฟล์ web.config หรือ app.config

ตอนนี้ฉันต้องการทดสอบปลั๊กอินของฉัน ฉันต้องการทดสอบพฤติกรรมที่แตกต่างกันในสภาวะต่างๆ:

ตัวอย่างเช่น:

  1. ควรทำเครื่องหมายเพียง 1 รายการว่าเป็น 'ค่าเริ่มต้น'
  2. สามารถลงทะเบียนกลุ่มผู้ให้บริการในปลั๊กอินได้ แต่ชื่อจะต้องไม่ซ้ำกัน มิฉะนั้นจะเกิดข้อยกเว้นเฉพาะ

คำถามของฉัน:

ฉันมีโครงการทดสอบหน่วยและต้องการทดสอบแต่ละวิธีด้วยไฟล์การกำหนดค่าแอปพลิเคชันอื่น เป็นไปได้หรือไม่

ฉันได้ลองอ่านไฟล์จาก ExeConfiguration แล้ว แต่ใช้งานไม่ได้

ขอบคุณสำหรับความคิดเห็น.

Kr,


person Complexity    schedule 14.11.2013    source แหล่งที่มา
comment
มีวิธีนี้ หากคุณสนใจที่จะเปลี่ยนค่าเริ่มต้น app.config ณ รันไทม์   -  person Sameer Singh    schedule 14.11.2013
comment
คุณสามารถใช้ตัวจัดการบล็อกการกำหนดค่าไลบรารีองค์กรของ Microsoft การกำหนดค่าของคุณได้ บล็อกการกำหนดค่านั้นทดสอบได้ง่ายมาก   -  person Kain    schedule 14.11.2013
comment
สวัสดี การเปลี่ยน AppSettings จะไม่ทำงานเนื่องจากฉันต้องอาศัยส่วนการกำหนดค่าแบบกำหนดเองจริงๆ ฉันต้องการให้ app.config ที่แตกต่างกันในการทดสอบหน่วยของฉัน และให้การทดสอบแต่ละหน่วยเลือกอันอื่น   -  person Complexity    schedule 14.11.2013


คำตอบ (2)


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

person TGH    schedule 14.11.2013
comment
ขอบคุณสำหรับคำตอบที่รวดเร็วมาก คุณช่วยยกตัวอย่างวิธีการทำเช่นนี้กับเฟรมเวิร์กการเยาะเย้ยได้ไหม เนื่องจากฉันยังใหม่กับการเยาะเย้ยเฟรมเวิร์ก คุณ - person Complexity; 14.11.2013
comment
โปรดทราบว่าฉันกำลังใช้ ConfigurationManager ดังนั้นจึงเป็นวัตถุนี้ที่ควรล้อเลียนมากกว่า? - person Complexity; 14.11.2013
comment
คุณอาจพบว่าการเรียกไปยัง ConfigurationManger และจำลอง Wrapper นั้นง่ายกว่า ขณะที่ฉันจำได้ว่า ConfigurationManger เป็นคลาสแบบคงที่ซึ่งทำให้ยากต่อการเยาะเย้ยโดยตรง - person TGH; 14.11.2013
comment
ขอขอบคุณอีกครั้งสำหรับความคิดเห็นของคุณ แต่คุณช่วยยกตัวอย่างว่าฉันจะบรรลุเป้าหมายนี้ได้อย่างไร ดังนั้นการทดสอบแต่ละครั้งควรมีส่วนการกำหนดค่าแบบกำหนดเองซึ่งจะแตกต่างจากการทดสอบครั้งก่อน ขอบคุณสำหรับความช่วยเหลือ - person Complexity; 14.11.2013

นี่คือสิ่งที่เราทำ (เหมือนกับ @THG) อธิบายไว้ในคำตอบของเขา

public interface IConfiguration
{
    string SettingA { get; }


    string SettingB { get; }
}


public class Configuration : IConfiguration
{

    public string SettingA
    {
        get
        {
            return ConfigurationManager.AppSettings["SettingA"];
        }
    }

    public string SettingB
    {
        get
        {
            return ConfigurationManager.AppSettings["SettingB"];
        }
    }
}

จากนั้นในการทดสอบของคุณ

    var config = MockRepository.GenerateStub<IConfiguration>();
    config.Stub(x => x.SettingA).Return("Fred");
person ozczecho    schedule 14.11.2013