DRY между константами производства и тестового кода

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

public class MyClass
{
    public DateTime Date { get; set; }
    public string User { get; set; }
    public int UserId { get; set; }

    public MyClass(IDictionary data)
    {
        Date = DateTime.Parse(data["Date"].ToString());
        User = data["User"].ToString();
        UserId = int.Parse(data["UserId"].ToString());
    }
}

Но Panagiotis прав, в этой ситуации вы должны воспользоваться преимуществом dapper, чтобы автоматически отобразить данные для ваших моделей. Их readme невероятно полезны, если вам нужно выяснить, как это работает или как делать сложные отображения.

11
задан Paul Croarkin 14 January 2009 в 13:27
поделиться

5 ответов

Да, используйте литерал здесь.

Заключение в кавычки меня от вопроса на литералах:

Литералы Hardcoded должны появиться в модульных тестах на тестовые значения, если нет такое повторное использование значения в единственном тестовом классе, что локальная константа полезна.

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

13
ответ дан 3 December 2019 в 05:36
поделиться

Для тестирования чего-то - чего-либо - важный фактор - то, что условия испытания стоят независимые от того, что Вы тестируете. Иначе Ваши тесты не имеют единственного, надежного значения; они превращают в некоторый другой тест каждый раз объект под изменениями исследования.

Не очень хорошая вещь.

Та же идея относится к модульным тестам. В контексте как выше строки Вы тестируете против, должно быть абсолютно независимо от того, что в протестированном классе. Другими словами, да, Вы можете и должны нарушить принцип DRY здесь.

5
ответ дан 3 December 2019 в 05:36
поделиться

Другой способ выразить то, что другие уже сказали: Если тест никогда не может перестать работать, нет никакого смысла в хранении его. Таким образом, это не имело бы смысла:

assertEquals(Feature.FEATURE_LABEL, Feature.FEATURE_LABEL);

Скажите, например, у Вас есть предел для списка. Нет никакого смысла в тестировании того предела == предел, тест должен попытаться поместить больше, чем предельные элементы в список.

OTOH, если Вы хотите удостовериться, что константы используются в надлежащем месте (т.е. он должен использоваться в качестве маркировки некоторого элемента UI), имеет смысл использовать тест с помощью строковой константы (вместо нового литерала).

Тем не менее для моих собственных тестов UI, я использую скребки, которые собирают все видимые строки и сравнивают получающуюся (длинную) строку с содержанием файла. Это - очень простой всеобъемлющий тест для неожиданных изменений в UI и работает лучше всего на UIs в HTML (я загружаю HTML и сравниваю его), но тот же шаблон может быть применен к любому UI.

2
ответ дан 3 December 2019 в 05:36
поделиться

Я придерживался бы ссылки в настоящий момент.

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

Это имеет какой-либо смысл?

1
ответ дан 3 December 2019 в 05:36
поделиться

Я думаю, что Вы имеете, хорошо, и да это - допустимое использование DRY: если это значение собирается закончиться в нескольких тестах, Вы не хотите изменять несколько, если значение изменяется. Но необходимо также добавить дополнительный тест, тот, который проверяет значение Функции. FEATURE_LABEL.

Это - хорошее место для применения "однажды и только дважды": если бы у Вас только был единственный тест, где значение FEATURE_LABEL было протестировано затем, я просто использовал бы литеральную строку. Это - только если у Вас есть несколько тестов с помощью него, где я начал бы использовать ссылку (и добавил бы тест для значения).

0
ответ дан 3 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: