Bisakah proyek uji unit memuat file app.config aplikasi target?

150

Saya unit sedang menguji aplikasi .NET (.exe) yang menggunakan file app.config untuk memuat properti konfigurasi. Aplikasi tes unit itu sendiri tidak memiliki file app.config.

Ketika saya mencoba untuk menguji unit metode yang memanfaatkan salah satu properti konfigurasi, mereka mengembalikan nol . Saya berasumsi ini karena aplikasi unit test tidak akan dimuat di app.config aplikasi target.

Apakah ada cara untuk menimpa ini atau apakah saya harus menulis skrip untuk menyalin konten dari app.config target ke app.config lokal?

Jenis posting ini menanyakan pertanyaan ini tetapi penulis benar-benar melihatnya dari sudut yang berbeda dari saya.

EDIT: Saya harus menyebutkan bahwa saya menggunakan Sistem Tim VS08 untuk tes unit saya.

Jordan Parmer
sumber

Jawaban:

59

Cara paling sederhana untuk melakukan ini adalah dengan menambahkan .configfile di bagian penerapan pada pengujian unit Anda.

Untuk melakukannya, buka .testrunconfigfile dari Item Solusi Anda. Di bagian Penerapan, tambahkan .configfile keluaran dari direktori bangunan proyek Anda (mungkin bin\Debug).

Apa pun yang tercantum di bagian penerapan akan disalin ke folder kerja proyek uji sebelum tes dijalankan, sehingga kode yang bergantung pada konfigurasi Anda akan berjalan dengan baik.

Sunting: Saya lupa menambahkan, ini tidak akan berfungsi dalam semua situasi, jadi Anda mungkin perlu menyertakan skrip startup yang mengubah nama output .configagar sesuai dengan nama unit test.

Jeromy Irvine
sumber
9
Jauh lebih mudah untuk hanya menambahkan app.config fiel ke proyek uji - Anda kemudian tidak perlu bermain-main dengan .testrunconfig sama sekali.
Rowland Shaw
13
@Rowland jika Anda melakukan itu, Anda harus menyimpan dua salinan app.config. Saya lebih suka menghabiskan 10 detik, sekali, menggunakan alat .testrunconfig daripada harus ingat untuk memperbarui app.config di kedua tempat.
Jeromy Irvine
66
Tidak bisakah Anda menambahkan referensi yang tidak menyalin? (Tambahkan Item yang Ada ...)
EFraim
6
Komentar EFraim harus menjadi jawaban yang diterima, ini jauh lebih sederhana daripada yang lainnya.
reggaeguitar
28
Untuk solusi EFraim: Pastikan untuk menggunakan "Tambahkan sebagai Tautan" dari tombol perintah. Kalau tidak, Anda masih mendapatkan salinan. Selain itu, meskipun pertanyaannya khusus untuk aplikasi .Net, ini tidak akan berfungsi untuk aplikasi web karena konfigurasi aplikasi web memiliki nama yang salah (Web.Config, bukan App.Config)
Rob Von Nesselrode
103

Dalam Visual Studio 2008 saya menambahkan app.configfile ke proyek uji sebagai item yang ada dan salin dipilih sebagai tautan untuk memastikan itu tidak digandakan. Dengan begitu saya hanya punya satu salinan dalam solusi saya. Dengan beberapa proyek pengujian, ini sangat berguna!

Tambahkan Item yang Ada

Tambahkan Sebagai Tautan

bbodenmiller
sumber
7
Jawaban sempurna, sederhana dan objektif! +1
Custodio
2
Ini adalah solusi terbaik dan harus ditandai sebagai jawabannya.
niaher
4
Untuk menambahkan item yang ada "sebagai tautan" Anda harus: "Di kotak dialog Tambah Item yang Ada, cari dan pilih item proyek yang ingin Anda tautkan", kemudian: "Dari daftar buka-bawah tombol Buka, pilih Tambahkan Sebagai Tautan. "
uriel
Ini bekerja baik untuk saya. Saya mencoba memikirkan situasi di mana itu tidak akan berhasil ... Dan saya sudah cukup berpikir sekarang. Terima kasih!
Dudeman3000
53

Baik Anda menggunakan Tes Sistem Tim atau NUnit , praktik terbaik adalah membuat Perpustakaan Kelas terpisah untuk tes Anda. Cukup menambahkan App.config ke proyek Uji Anda akan secara otomatis disalin ke folder bin Anda ketika Anda kompilasi .

Jika kode Anda bergantung pada tes konfigurasi tertentu, tes pertama yang saya tulis akan memvalidasi bahwa file konfigurasi tersedia ( sehingga saya tahu saya tidak gila ):

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

Dan tesnya:

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

Idealnya, Anda harus menulis kode sedemikian rupa sehingga objek konfigurasi Anda diteruskan ke kelas Anda. Ini tidak hanya memisahkan Anda dari masalah file konfigurasi, tetapi juga memungkinkan Anda untuk menulis tes untuk berbagai skenario konfigurasi.

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());
     }
}
bryanbcook
sumber
2
Saya setuju dengan semangat meneruskan ketergantungan konfigurasi di sini, ini sepertinya telah dijawab, oleh Mark Seemann! ke sini: Tes unit gagal karena file .config hilang
Shaun
Ada "yang hilang dari baris: string value = ConfigurationManager.AppSettings [" TestValue]; Saya mencoba untuk memperbaikinya, tetapi harus menemukan 5 karakter lebih lanjut untuk diperbaiki untuk mendapatkan stackoverflow agar saya dapat mengedit.
Jane
22

Jika Anda memiliki solusi yang berisi misalnya Aplikasi Web dan Proyek Uji, Anda mungkin ingin agar Proyek Uji menggunakan web.config Aplikasi Web.

Salah satu cara untuk mengatasinya adalah menyalin web.config untuk menguji proyek dan menamainya sebagai app.config.

Solusi lain dan lebih baik adalah memodifikasi rantai build dan membuatnya untuk membuat salinan otomatis web.config untuk menguji direktori keluaran proyek. Untuk melakukan itu, klik kanan Aplikasi Uji dan pilih properti. Sekarang Anda akan melihat properti proyek. Klik "Bangun Acara" dan kemudian klik tombol "Edit Post-build ...". Tulis baris berikut ke sana:

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

Dan klik OK. (Perhatikan bahwa Anda kemungkinan besar perlu mengubah WebApplication1 saat Anda memproyeksikan nama yang ingin Anda uji). Jika Anda memiliki jalur yang salah ke web.config maka penyalinan gagal dan Anda akan melihatnya saat pembangunan gagal.

Edit:

Untuk Menyalin dari Proyek saat ini ke Proyek Uji:

copy "$(ProjectDir)bin\WebProject.dll.config" "$(SolutionDir)WebProject.Tests\bin\Debug\App.Config"
Antti
sumber
Solusi yang sangat bagus. Ini membantu saya menghindari menyalin dan menggandakan .configfile. Terima kasih telah berbagi! :)
Leniel Maccaferri
Solusi yang sangat bagus! Terima kasih banyak.
Vin Shahrdar
Solusi yang bagus, tetapi apa yang terjadi ketika utama web.confighanya memiliki referensi ke .configfile eksternal dalam proyek yang sama. Karena jalur hanya dapat menunjuk ke folder dalam direktori yang sama (yang benar secara normal), saat menjalankan tes, itu tidak akan dapat menangani file-file eksternal. Adakah cara mengatasinya?
Sugafree
Ini bekerja untuk saya: salin "$ (SolutionDir) \ MainProject \ Web.config" "$ (ProjectDir) app.config"
Andrew
8

Ini agak lama tetapi saya menemukan solusi yang lebih baik untuk ini. Saya mencoba jawaban yang dipilih di sini tetapi sepertinya .testrunconfig sudah usang.

1. Untuk Tes Unit, Bungkus konfigurasi adalah Interface (IConfig)

untuk pengujian Unit, konfigurasi seharusnya tidak menjadi bagian dari pengujian Anda, jadi buat tiruan yang dapat Anda suntikkan. Dalam contoh ini saya menggunakan Moq.

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

2. Untuk uji Integrasi, tambahkan secara dinamis konfigurasi yang Anda butuhkan

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");
MichaelChan
sumber
5

Ini sangat mudah.

  • Klik kanan pada proyek pengujian Anda
  • Tambah -> Item yang ada
  • Anda dapat melihat panah kecil tepat di sebelah tombol Add
  • Pilih file config klik pada "Add As Link"
Hari Das
sumber
4

Jika Anda menggunakan NUnit, lihat posting ini . Pada dasarnya Anda harus memiliki app.config di direktori yang sama dengan file .nunit Anda.

Cory Foy
sumber
Saya menggunakan Sistem Tim VS08 untuk pengujian unit saya tetapi terima kasih atas tip NUnit!
Jordan Parmer
2

Jika aplikasi Anda menggunakan pengaturan seperti Asp.net ConnectionString Anda perlu menambahkan atribut HostType ke metode Anda, jika tidak mereka akan memuat bahkan jika Anda memiliki file App.Config.

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

}
Zyo
sumber
0

Saya menggunakan NUnit dan dalam direktori proyek saya, saya memiliki salinan App.Config saya bahwa saya mengubah beberapa konfigurasi (misalnya saya mengarahkan ulang ke database pengujian ...). Anda harus memilikinya di direktori yang sama dengan proyek yang diuji dan Anda akan baik-baik saja.

Patrick Desjardins
sumber
0

Saya tidak bisa mendapatkan saran ini untuk bekerja dengan nUnit 2.5.10 jadi saya akhirnya menggunakan Project nUnit -> Edit fungsionalitas untuk menentukan file konfigurasi untuk ditargetkan (seperti yang orang lain katakan perlu berada di folder yang sama dengan. file nunit itu sendiri). Sisi positif dari hal ini adalah bahwa saya dapat memberikan file config nama Test.config yang membuatnya lebih jelas apa itu dan mengapa itu)

Jane
sumber
0

Tes unit Anda dianggap sebagai lingkungan yang menjalankan kode Anda untuk mengujinya. Sama seperti lingkungan normal, Anda memiliki staging / produksi. Anda mungkin perlu menambahkan .configfile untuk proyek pengujian Anda juga. Solusinya adalah membuat perpustakaan kelas dan mengonversinya menjadi Proyek Uji dengan menambahkan paket NuGet yang diperlukan seperti NUnit dan NUnit Adapter. itu berfungsi dengan baik dengan Visual Studio Test Runner dan Resharper dan Anda memiliki app.configfile Anda dalam proyek pengujian Anda. masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Dan akhirnya men-debug tes dan nilai saya dari App.config:

masukkan deskripsi gambar di sini

Ben
sumber