Подтвердить что ты не робот

Является ли это тестовое имя чуть более сверху

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

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


    }
4b9b3361

Ответ 1

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

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

Ответ 2

Одним из популярных способов тестирования макета является использование вложенных классов с использованием слова "Дата/Когда/Тогда", как это предлагается типичными практиками BDD, например

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

ChargeGreaterThanRestingButLessThanRestApproachStep_OnUpdate_ChargeSetToResting

Не менее описательный, гораздо более легко читаемый...

Как говорится в объявлениях Windows Phone 7 "Больше взгляда и перехода"

Ответ 5

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

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

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

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

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