Nunit: Direktori kerja untuk pengujian di konsol NUnit 3

Dibuat pada 26 Nov 2015  ·  21Komentar  ·  Sumber: nunit/nunit

Di NUnit 2.6.4, direktori kerja untuk pengujian saya disetel ke direktori bin/Debug dari DLL pengujian. Ini memungkinkan saya memuat file eksternal dalam pengujian dengan jalur relatif.

Tampaknya direktori kerja sekarang diatur ke direktori kerja pelari konsol. Apakah ini dengan desain?

Bagaimana saya bisa meninggalkan hasil tes (*.xml file) di direktori kerja pelari konsol sementara direktori kerja untuk pengujian saya disetel ke bin/Debug ?

notabug

Komentar yang paling membantu

@imakowski sudahkah Anda mencoba mengatur direktori kerja saat ini ke direktori yang dikenal dalam pengaturan Majelis? Kode yang belum diuji, tetapi sesuatu seperti;

``` C#
[SetUpFixture]
kelas publik MySetUpClass
{
[OneTimeSetUp]
JalankanSebelumAnyTests()
{
var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
Environment.CurrentDirectory = dir;

    // or
    Directory.SetCurrentDirectory(dir);
}

}
```

Semua 21 komentar

Ini dirancang, seperti yang ditunjukkan di sini: https://github.com/nunit/nunit/wiki/Breaking-Changes

Di versi sebelumnya, NUnit mengubah direktori kerja. Tidak lagi melakukannya. Anda dapat menggunakan TestContext.TestDirectory untuk mendapatkan direktori yang berisi rakitan pengujian.

Ini merusak banyak ujian! Mengapa Anda mengubah itu? Beberapa pengujian tidak dapat diperbaiki karena kode runtime dari aplikasi yang diuji memiliki ketergantungan bahwa direktori kerja adalah lokasi perakitan pengujian.

@imakowski sudahkah Anda mencoba mengatur direktori kerja saat ini ke direktori yang dikenal dalam pengaturan Majelis? Kode yang belum diuji, tetapi sesuatu seperti;

``` C#
[SetUpFixture]
kelas publik MySetUpClass
{
[OneTimeSetUp]
JalankanSebelumAnyTests()
{
var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);
Environment.CurrentDirectory = dir;

    // or
    Directory.SetCurrentDirectory(dir);
}

}
```

@imakowski Anda mungkin tidak memiliki kendali atasnya, tetapi kode/aplikasi tidak boleh bergantung pada direktori kerja saat ini yang sedang disetel. Aplikasi harus selalu menentukan direktori bin mereka dengan kode seperti yang saya sajikan di atas. Ada beberapa panggilan API di Windows yang mengubah direktori kerja saat ini tanpa Anda sadari. Aplikasi Anda dapat berjalan dengan baik hampir sepanjang waktu, tetapi kemudian gagal setelah pengguna mengunjungi bagian yang jarang digunakan dari aplikasi Anda.

@rprouse kode ini tidak berfungsi saat dalam mode salin bayangan
var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);

Anda dapat menggunakan ini dalam kasus itu:
var dir = Path.GetDirectoryName(new Uri(typeof(MySetUpClass).Assembly.CodeBase).LocalPath);

Atau, kami menyediakannya untuk Anda sebagai TestContext.CurrentContext.TestDirectory. :-)

Kami menggunakan Uri seperti yang disarankan dengan beberapa penyesuaian untuk kasus khusus.

Atau, kami menyediakannya untuk Anda sebagai TestContext.CurrentContext.TestDirectory. :-)

tidak ada lagi properti TestDirectory di CurrentContext. saya menggunakan nunit 3.6.1. hanya ada WorkDirectory yang dalam kasus saya ketika saya memulai tes dari titik resharper ke tempat yang salah :(

Ada TestContext.TestDirectory. Ini adalah properti statis. Saya percaya bahwa WorkDirectory juga?

baik, saya tidak dapat menemukannya baik menggunakan browser visual studio atau compiler atau teleric decompiler.
tapi saya melihatnya di nunit 3.5. tidak yakin apa yang salah

Saya salah.

Ini adalah TestContext.CurrentContext.TestDirectory.

Namun, itu tidak ada di PORTABLE build.

#if !PORTABLE
        /// <summary>
        /// Gets the directory containing the current test assembly.
        /// </summary>
        public string TestDirectory
        {
            get
            {
                Assembly assembly = _testExecutionContext?.CurrentTest?.TypeInfo?.Assembly;

                if (assembly != null)
                    return AssemblyHelper.GetDirectoryName(assembly);

#if NETSTANDARD1_6
                // Test is null, we may be loading tests rather than executing.
                // Assume that the NUnit framework is in the same directory as the tests
                return AssemblyHelper.GetDirectoryName(typeof(TestContext).GetTypeInfo().Assembly);
#else
                // Test is null, we may be loading tests rather than executing.
                // Assume that calling assembly is the test assembly.
                return AssemblyHelper.GetDirectoryName(Assembly.GetCallingAssembly());
#endif
            }
        }
#endif

itu ada di 3.6.0 tetapi tidak di 3.6.1

Saya melihat repo github saat ini, dan persis seperti yang saya salin dan tempel di atas.

Apakah Anda yakin Anda tidak menggunakan build PORTABLE?

ya, saya menggunakannya

Nah, makanya tidak ada. Itu tidak didukung dalam PORTABLE build, dan tidak pernah, sepengetahuan saya. Namun, saya tidak pernah menggunakan PORTABLE build, jalankan saja tes CI terhadapnya.

Terima kasih

Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);

Untuk orang-orang yang mencari kode aktual, menyatukan apa yang dikatakan @CharliePoole dan @rprouse , itu

[SetUpFixture]
public class MySetUpClass
{
    [OneTimeSetUp]
    public void RunBeforeAnyTests()
    {
        Environment.CurrentDirectory = TestContext.CurrentContext.TestDirectory;
        // or identically under the hoods
        Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
    }
}

Untuk inisialisasi global

Hanya saja, jangan sertakan logika di atas di dalam namespace apa pun. yaitu

using NUnit.Framework;
using System;
using System.IO;

[SetUpFixture]
public class GlobalSetup
{
    [OneTimeSetUp]
    public void RunBeforeAnyTests()
    {
        Environment.CurrentDirectory = TestContext.CurrentContext.TestDirectory;
        // or identically under the hoods
        Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
    }
}

Juga, tampaknya TestContext.CurrentContext.TestDirectory memiliki lebih banyak kecerdasan untuk mengatasi kasus sudut, jadi saya akan memilih itu daripada typeof(MySetUpClass).Assembly.Location

jadi saya akan memilih itu daripada typeof(MySetUpClass).Assembly.Location

Location mengembalikan lokasi bayangan jika rakitan disalin bayangan, biasanya Anda tidak menginginkannya. Gunakan CodeBase sebagai gantinya, yang mengembalikan Uri dari lokasi sebenarnya yang awalnya dijalankan, sebelum penyalinan bayangan.

Jelas lebih baik menggunakan TestDirectory , tetapi tampaknya ada masalah dengan properti itu, lihat #2872, menyebabkan pengecualian yang tidak dapat ditangkap. Saya tidak tahu apakah mereka juga dapat muncul jika Anda menggunakan OneTimeSetup (saya berasumsi tidak), tetapi harus berhati-hati sampai hal itu ditangani.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat