سؤال

كما يوحي العنوان ، هل اسم الاختبار هذا مجرد القليل من الأعلى؟

WhenChargeIsGreaterThanRestingChargeButLessThanChargeRestApproachStep_OnUpdate_ChargeIsSetToRestingCharge

أي اقتراحات حول كيفية تحسين هذا؟ أم أنها بخير كما هي؟

فيما يلي جهاز الاختبار بأكمله كما هو الحال حتى تتمكن من الحصول على بعض السياق :)

public class NeuronTests    
{
        [Fact]
        public void OnUpdate_NeuronFiresWhenChargeIsEqualToThreshold()
        {
            Neuron neuron = new Neuron();
            bool fired = false;
            neuron.Fired += (s, e) => fired = true;
            neuron.Charge = Neuron.ChargeThreshold;

            neuron.Update();

            Assert.True(fired, "Neuron didn't fire");
        }

        [Fact]
        public void OnUpdate_NeuronDoesntFireWhenChargeIsLessThanThreshold()
        {
            Neuron neuron = new Neuron();
            bool fired = false;
            neuron.Fired += (s, e) => fired = true;

            neuron.Charge = Neuron.ChargeThreshold - 1f;
            neuron.Update();

            Assert.False(fired, "Neuron fired!");
        }

        [Fact]
        public void OnUpdate_NeuronFiresWhenChargeIsGreaterThanThreshold()
        {
            Neuron neuron = new Neuron();
            bool fired = false;
            neuron.Fired += (s, e) => fired = true;
            neuron.Charge = Neuron.ChargeThreshold + 1f;

            neuron.Update();

            Assert.True(fired, "Neuron didn't fire");
        }

        [Fact]
        public void WhenNeuronFires_ChargeResetsToRestingCharge()
        {
            Neuron neuron = new Neuron();
            neuron.Charge = Neuron.ChargeThreshold;

            neuron.Update();

            Assert.Equal(Neuron.RestingCharge, neuron.Charge);
        }

        [Fact]
        public void AfterFiring_OnUpdate_NeuronWontFire()
        {
            Neuron neuron = new Neuron();
            int fireCount = 0;
            neuron.Fired += (s, e) => fireCount++;

            neuron.Charge = Neuron.ChargeThreshold;
            neuron.Update();
            neuron.Charge = Neuron.ChargeThreshold;
            neuron.Update();

            Assert.Equal(1, fireCount);
        }

        [Fact]
        public void WhenResting_OnUpdate_NeuronWillFire()
        {
            Neuron neuron = new Neuron();
            int fireCount = 0;
            neuron.Fired += (s, e) => fireCount++;

            neuron.Charge = Neuron.ChargeThreshold;
            neuron.Update();
            neuron.Charge = Neuron.ChargeThreshold;
            neuron.Update();
            neuron.Charge = Neuron.ChargeThreshold;
            neuron.Update();

            Assert.Equal(2, fireCount);
        }

        [Fact]
        public void WhenChargeIsGreaterThanRestingCharge_OnUpdate_ChargeDecreasesTowardsRestingCharge()
        {
            Neuron neuron = new Neuron();

            neuron.Charge = Neuron.RestingCharge + (2 * Neuron.ChargeRestApproachStep);

            neuron.Update();

            Assert.Equal(Neuron.RestingCharge + Neuron.ChargeRestApproachStep, neuron.Charge);
        }

        [Fact]
        public void WhenChargeIsGreaterThanRestingChargeButLessThanChargeRestApproachStep_OnUpdate_ChargeIsSetToRestingCharge()
        {
            Neuron neuron = new Neuron();

            neuron.Charge = Neuron.RestingCharge + (Neuron.ChargeRestApproachStep * 0.5f);

            neuron.Update();

            Assert.Equal(Neuron.RestingCharge, neuron.Charge);
        }


    }
هل كانت مفيدة؟

المحلول

رأيي الشخصي هو أن أسماء الأسلوب لا يمكن أن تكون طويلة جدًا ، طالما أنها وصفية.

تميل أسماء اختبار الوحدة إلى أن تكون أطول بكثير ، حيث يجب أن تحتوي على مزيد من المعلومات. هذا جيد بالنسبة لي أيضًا ، نظرًا لأنها تظهر فقط في توقيع الطريقة وفي قائمة الاختبارات الخاصة بك (وهذا هو المكان الذي تريد أن يكون فيه اسم جيد) ، فلن تتصل بهم أبدًا من أي رمز آخر.

نصائح أخرى

تتمثل إحدى الطرق الشائعة في اختبارات تخطيط مثل هذه في استخدام الفئات المتداخلة مع المفردات المعطى/ثم/ثم اكتب على النحو المقترح من خلال ممارسات BDD النموذجية ، على سبيل المثال

public class NeuronStory
{
    public class GivenChargeIsGreaterThanRestingCharge
    {
        public class GivenChargeIsLessThanChargeRestApproachStep
        {
            public class WhenUpdated
            {
                public void ThenChargeIsSetToRestingCharge()
                {
                }
            }
        }
    }
}

وبهذه الطريقة يمكنك أيضًا أن تعشش الاختبارات الأخرى التي تتناسب أيضًا مع GivenChargeIsGreaterThanRestingCharge قصة في نفس المكان.

تعطي السطح أدلة على ما تعتقد أنه ينبغي نقله من اسم الطريقة.

  • حرك ما هو قيد الاختبار لاسم الفصل.
  • انقل ما يجب أن تكون نتيجة الاختبار إلى بيان التأكيد (تعليق إذا لزم الأمر). لماذا ا؟ إذا تغير التأكيد في الاختبار على الإطلاق ، فهل يجب أن يتغير اسم الاختبار؟

ثم يمكن أن يكون لديك:

public class NeuronOnUpdateTests
{
  public void WhenChargeIsBetweenRestingChargeAndChargeRestApproachStep
  {
    //Charge is set to resting state
    Assert.True(x);
  }
}

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

هذا ينطبق على الاختبارات أيضا. عندما أشعر بالحاجة إلى كتابة مقال كعنوان وظيفة ، أخرج "عندما يكون" "هو" والكلمات المتكررة ... مغادرة:

ChargeGreaterThanrestingButlessHanrestApproachStep_Onupdate_ChargesetTorEsting

ليس أقل وصفية بكثير ، وأكثر قابلية للقراءة بسهولة ...

كما تقول إعلانات Windows Phone 7 "المزيد من النظرة والذهاب"

جانبا ، طريقة واحدة (بالتأكيد ليست الطريقة الوحيدة) لاختبارات التسمية هي كتابة اسم الاختبار الخاص بك كتأكيد.

مثال بسيط (ساذج):

int Add(object a, object b)
{
   return a+b;
}

[TestMethod]
void AddFailsWithNonIntegerArguments()
{
    try
    {
      Add("Hello", "World");
      Assert::Fail();
    }
    catch
    {
      Assert::Pass();
    }
}

على السؤال الرئيسي ، أعتقد أن أسماء وظائف الاختبار الطويلة جيدة ، طالما أنها لا لبس فيها

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top