Это название теста просто немного выше - PullRequest
12 голосов
/ 10 ноября 2010

Как видно из названия, это название теста - лишь немногое из верха?

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


    }

Ответы [ 5 ]

20 голосов
/ 10 ноября 2010

Один из популярных способов создания таких тестов - использование вложенных классов со словарем типа Given / When / Then, как это предлагается в типичных практиках BDD, например

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

Таким образом, вы можете также вкладывать другие тесты, которые также вписываются в сюжетную линию GivenChargeIsGreaterThanRestingCharge в том же месте.

15 голосов
/ 10 ноября 2010

Мое личное мнение таково, что имена методов никогда не могут быть слишком длинными, если они являются описательными.

Имена модульных тестов имеют тенденцию быть намного длиннее, поскольку они должны содержать больше информации.Это тоже хорошо для меня, так как они появляются только в сигнатуре метода и в вашем списке тестов (и именно здесь вы хотите иметь хорошее имя), вы никогда не будете вызывать их из любого другого кода.

3 голосов
/ 10 ноября 2010

Подчеркивание подсказывает, что, по вашему мнению, должно быть исключено из имени метода.

  • Переместить проверяемое в имя класса.
  • Переместить, каким должен быть результат теста, в утверждение assert (при необходимости, прокомментировать). Зачем? Если утверждение в тесте когда-либо изменяется, изменится ли название теста?

Тогда вы могли бы иметь:

public class NeuronOnUpdateTests
{
  public void WhenChargeIsBetweenRestingChargeAndChargeRestApproachStep
  {
    //Charge is set to resting state
    Assert.True(x);
  }
}
1 голос
/ 10 ноября 2010

Кроме того, один из способов (хотя и не единственный) именования тестов состоит в том, чтобы написать имя теста в качестве утверждения.

Простой (наивный) пример:

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

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

По основному вопросу, я думаю, длинные имена функций тестирования хороши, если они однозначны

1 голос
/ 10 ноября 2010

Это немного долго, сопровождающие хотят прочитать функцию, чтобы получить быстрое представление о том, что делает функция, имея что-то такое, что позволяет быстрее читать саму функцию.

Это относится и к тестам. Когда я чувствую необходимость написать эссе в качестве заголовка функции, я убираю слова «Когда», «Есть» и повторяю слова… оставляя:

ChargeGreaterThanRestingButLessThanRestApproachStep_OnUpdate_ChargeSetToResting

Не намного менее наглядно, гораздо более легко читаемо ...

Как в рекламе Windows Phone 7 говорится: «Больше взгляда и вперед»

...