SpecFlow — внедрение контекста против контекста сценария

Любой, кто использует SpecFlow, вероятно, сталкивался с внедрением контекста и контекстом сценария для хранения данных в разных классах привязки. (Подробнее см.: https://specflow.org/documentation/Sharing-Data-between-Bindings/)

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

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


person Charlie Seligman    schedule 29.06.2018    source источник


Ответы (2)


О разнице: в дополнение к этому внедрение контекста обеспечивает лучшую безопасность статического типа. (Я написал статью о модели децентрализованной архитектуры, которую можно создать с помощью внедрения контекста: http://gasparnagy.com/2017/02/specflow-tips-baseclass-or-context-injection/)

Почему контекст сценария? Прежде всего, эта функция существовала до внедрения контекста и использовалась во многих учебниках и т. д. Так что она более известна.

Кроме того, контекст сценария является несколько более простой концепцией программирования. Вы просто получаете и устанавливаете некоторую глобальную переменную. Для внедрения контекста вы должны понимать конструкторы, поля экземпляров и локальные переменные. Я думаю, что это важные вещи, которые нужно изучить в любом случае, но может быть слишком много сразу (без посторонней помощи).

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

person Gaspar Nagy    schedule 09.07.2018
comment
Согласен, Context Injection предпочтительнее, потому что это объектно-ориентированный подход. C# — это объектно-ориентированный язык, в нем не выжить, если вы все равно не знаете этих концепций. - person silver; 27.10.2019

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

public void GenericSaveIntTestMethod(string variableName, int intToSave){

    ScenarioContext.Current[variableName] = intToSave;

}

Вы можете использовать это повторно. Сохранение разных целых чисел под разными именами. Я не уверен, является ли это хорошей или плохой практикой, но я видел, как она используется в среде, в которой я работаю. Я не уверен, есть ли способ сделать это с помощью Context Injection.

person Megan Styles    schedule 20.09.2019
comment
Внедрение контекста использует объекты. С тем же успехом можно создать POCO с этими полями. См. здесь. - person silver; 27.10.2019