Nunit: دليل العمل للاختبارات في وحدة التحكم NUnit 3

تم إنشاؤها على ٢٦ نوفمبر ٢٠١٥  ·  21تعليقات  ·  مصدر: nunit/nunit

في NUnit 2.6.4 ، تم تعيين dir العامل لاختباراتي على الدليل المقابل bin/Debug لاختبار DLL. سمح لي هذا بتحميل الملفات الخارجية في الاختبارات حسب المسار النسبي.

يبدو أن dir يعمل الآن مضبوطًا على دليل عمل عداء وحدة التحكم. هل هذا حسب التصميم؟

كيف يمكنني ترك نتائج الاختبار (ملفات * .xml) في مسار عمل وحدة التحكم أثناء تعيين dir للعمل في الاختبارات الخاصة بي على bin/Debug ؟

notabug

التعليق الأكثر فائدة

imakowski هل حاولت تعيين دليل العمل الحالي إلى دليل معروف في إعداد التجميع؟ كود لم يتم اختباره ، ولكن شيء مثل ؛

ج #
[SetUpFixture]
فئة عامة MySetUpClass
{
[اعداد لمرة واحدة]
RunBeforeAnyTests ()
{
var dir = Path.GetDirectoryName (typeof (MySetUpClass) .Assembly.Location) ؛
Environment.CurrentDirectory = dir؛

    // or
    Directory.SetCurrentDirectory(dir);
}

}
""

ال 21 كومينتر

هذا حسب التصميم ، كما هو موضح هنا: https://github.com/nunit/nunit/wiki/Breaking-Changes

في الإصدارات السابقة ، قامت NUnit بتغيير دليل العمل. لم يعد يفعل ذلك. يمكنك استخدام TestContext.TestDirectory للحصول على الدليل الذي يحتوي على تجميع الاختبار.

هذا يكسر الكثير من الاختبار! لماذا غيرت ذلك؟ لا يمكن إصلاح بعض الاختبارات لأن كود وقت تشغيل التطبيق الذي تم اختباره له تبعية أن دليل العمل هو موقع تجميع الاختبار.

imakowski هل حاولت تعيين دليل العمل الحالي إلى دليل معروف في إعداد التجميع؟ كود لم يتم اختباره ، ولكن شيء مثل ؛

ج #
[SetUpFixture]
فئة عامة MySetUpClass
{
[اعداد لمرة واحدة]
RunBeforeAnyTests ()
{
var dir = Path.GetDirectoryName (typeof (MySetUpClass) .Assembly.Location) ؛
Environment.CurrentDirectory = dir؛

    // or
    Directory.SetCurrentDirectory(dir);
}

}
""

imakowski قد لا تتحكم فيه ، ولكن لا يجب أن تعتمد التعليمات البرمجية / التطبيقات على دليل العمل الحالي الذي يتم تعيينه. يجب أن تحدد التطبيقات دائمًا دليل bin الخاص بها برمز مثل الذي قدمته أعلاه. هناك العديد من استدعاءات API في Windows التي تغير دليل العمل الحالي دون أن تكون على علم بذلك. يمكن أن يعمل التطبيق الخاص بك بشكل جيد في معظم الأوقات ، ولكنه يفشل بعد ذلك بعد زيارة المستخدم لجزء نادر الاستخدام من التطبيق الخاص بك.

rprouse لا يعمل هذا الرمز عندما يكون في وضع النسخة الاحتياطية
var dir = Path.GetDirectoryName(typeof(MySetUpClass).Assembly.Location);

يمكنك استخدام هذا في هذه الحالة:
var dir = Path.GetDirectoryName(new Uri(typeof(MySetUpClass).Assembly.CodeBase).LocalPath);

بدلاً من ذلك ، نوفره لك باسم TestContext.CurrentContext.TestDirectory. :-)

نستخدم Uri كما هو مقترح مع بعض التعديلات للحالات الخاصة.

بدلاً من ذلك ، نوفره لك باسم TestContext.CurrentContext.TestDirectory. :-)

لا توجد خاصية TestDirectory في CurrentContext بعد الآن. أستخدم نونيت 3.6.1. لا يوجد سوى WorkDirectory الذي في حالتي عندما أبدأ الاختبار من نقاط resharper إلى مكان خاطئ :(

يوجد TestContext.TestDirectory. إنها خاصية ثابتة. أعتقد أن WorkDirectory كذلك؟

حسنًا ، لا يمكنني العثور عليه سواء باستخدام مستعرض الاستوديو المرئي أو المترجم أو وحدة فك التشفير عن بُعد.
لكني أراه في nunit 3.5. لست متأكدا ما هو الخطأ

كنت مخطئا.

إنه TestContext.CurrentContext.TestDirectory.

ومع ذلك ، فهو ليس موجودًا في جهاز PORTABLE.

#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

إنه موجود في 3.6.0 ولكن ليس في 3.6.1

أنا أنظر إلى مستودع جيثب الحالي ، وهو بالضبط نفس ما قمت بنسخه ولصقه أعلاه.

هل أنت متأكد من أنك لا تستخدم تصميم PORTABLE بطريقة ما؟

نعم ، أنا أستخدمه

حسنًا ، هذا هو السبب في عدم وجودها. لم يتم دعمه في تصميم PORTABLE ، ولم يكن كذلك أبدًا ، على حد علمي. ومع ذلك ، لم أستخدم مطلقًا بنية PORTABLE ، ما عليك سوى تشغيل اختبارات CI ضدها.

اشكرك

Directory.SetCurrentDirectory (AppDomain.CurrentDomain.BaseDirectory) ،

بالنسبة للأشخاص الذين يتطلعون إلى الكود الفعلي ، فإن تجميع ما قاله CharliePoole و rprouse ، هو

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

للتهيئة العالمية

فقط لا تضع المنطق أعلاه داخل أي مساحة اسم. بمعنى آخر

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);
    }
}

أيضًا ، يبدو أن TestContext.CurrentContext.TestDirectory يحتوي على مزيد من الذكاء لمعالجة حالات الركن ، لذلك سأختار أكثر من typeof(MySetUpClass).Assembly.Location

لذلك سأختار ذلك على typeof (MySetUpClass)

Location بإرجاع موقع الظل إذا كان التجميع منسوخًا في الظل ، فلن ترغب في ذلك عادةً. استخدم CodeBase بدلاً من ذلك ، والذي يُرجع Uri من الموقع الفعلي الذي يتم تشغيله منه في البداية ، قبل أي نسخ ظل.

من الواضح أنه من الأفضل استخدام TestDirectory ، ولكن يبدو أن هناك مشكلات في هذه الخاصية ، راجع # 2872 ، مما تسبب في استثناءات لا يمكن اكتشافها. لا أعرف ما إذا كان بإمكانهم الظهور أيضًا إذا كنت تستخدم OneTimeSetup (أفترض أنه لا) ، ولكن يجب توخي الحذر حتى يتم معالجة ذلك.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات