Посетите веб-сайт NSubstitute для получения дополнительной информации.
NSubstitute разработан как удобная замена макетным библиотекам .NET.
Это попытка удовлетворить нашу жажду имитирующей библиотеки с кратким синтаксисом, который помогает нам сосредоточиться на цели наших тестов, а не на конфигурации наших двойников тестов. Мы постарались сделать наиболее часто необходимые операции очевидными и простыми в использовании, сохраняя менее привычные сценарии видимыми и доступными, сохраняя при этом как можно больше естественного языка.
Идеально подходит для новичков в тестировании и для тех, кто просто хотел бы, чтобы их тесты были написаны с меньшим количеством шума и лямбда-выражений.
Если у вас есть вопросы, пожелания или отзывы о NSubstitute, пожалуйста, поднимите проблему на сайте нашего проекта. Все вопросы приветствуются через сайт нашего проекта, но для вопросов в стиле «как сделать» вы также можете попробовать StackOverflow с тегом [nsubstitute], что часто приводит к очень хорошим ответам от более широкого сообщества программистов. StackOverflow особенно полезен, если ваш вопрос также касается других библиотек, с которыми наша команда, возможно, не так хорошо знакома (например, NSubstitute с Entity Framework).
Допустим, у нас есть базовый интерфейс калькулятора:
public interface ICalculator
{
int Add ( int a , int b ) ;
string Mode { get ; set ; }
event Action PoweringUp ;
}
Мы можем попросить NSubstitute создать экземпляр-заменитель для этого типа. Мы могли бы запросить заглушку, макет, подделку, шпион, тестовый дубль и т. д., но зачем беспокоиться, если мы просто хотим заменить экземпляр, над которым у нас есть некоторый контроль?
_calculator = Substitute . For < ICalculator > ( ) ;
virtual
членами классов. Будьте осторожны, заменяя классы невиртуальными членами. Дополнительные сведения см. в разделе Создание замены.
Теперь мы можем указать нашей подмене вернуть значение для вызова:
_calculator . Add ( 1 , 2 ) . Returns ( 3 ) ;
Assert . That ( _calculator . Add ( 1 , 2 ) , Is . EqualTo ( 3 ) ) ;
Мы можем проверить, что наш заместитель получил звонок, а другие не принимал:
_calculator . Add ( 1 , 2 ) ;
_calculator . Received ( ) . Add ( 1 , 2 ) ;
_calculator . DidNotReceive ( ) . Add ( 5 , 7 ) ;
Если наше утверждение Received() терпит неудачу, NSubstitute пытается помочь нам понять, в чем может быть проблема:
NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
Add(1, 2)
Actually received no matching calls.
Received 2 non-matching calls (non-matching arguments indicated with '*' characters):
Add(1, *5*)
Add(*4*, *7*)
Мы также можем работать со свойствами, используя синтаксис Returns, который мы используем для методов, или просто использовать старые добрые методы установки свойств (для свойств чтения/записи):
_calculator . Mode . Returns ( "DEC" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
_calculator . Mode = "HEX" ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;
NSubstitute поддерживает сопоставление аргументов для установки возвращаемых значений и подтверждения получения вызова:
_calculator . Add ( 10 , - 5 ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Any < int > ( ) ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Is < int > ( x => x < 0 ) ) ;
Мы можем использовать сопоставление аргументов, а также передать функцию в Returns(), чтобы получить больше поведения от нашей замены (возможно, слишком много, но это ваше дело):
_calculator
. Add ( Arg . Any < int > ( ) , Arg . Any < int > ( ) )
. Returns ( x => ( int ) x [ 0 ] + ( int ) x [ 1 ] ) ;
Assert . That ( _calculator . Add ( 5 , 10 ) , Is . EqualTo ( 15 ) ) ;
Returns() также можно вызывать с несколькими аргументами для установки последовательности возвращаемых значений.
_calculator . Mode . Returns ( "HEX" , "DEC" , "BIN" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "BIN" ) ) ;
Наконец, мы можем вызывать события для наших заменителей (к сожалению, C# резко ограничивает степень очистки этого синтаксиса):
bool eventWasRaised = false ;
_calculator . PoweringUp += ( ) => eventWasRaised = true ;
_calculator . PoweringUp += Raise . Event < Action > ( ) ;
Assert . That ( eventWasRaised ) ;
NSubstitute и его тесты можно скомпилировать и запустить с помощью Visual Studio, Visual Studio Code или любого другого редактора с поддержкой .NET. Обратите внимание, что некоторые тесты имеют пометку [Pending]
и в настоящее время не предназначены для прохождения, поэтому рекомендуется исключить тесты в категории «Ожидание» из тестовых запусков.
В каталоге ./build
также имеются сценарии сборки для сборок из командной строки и конфигурации CI в корне проекта.
Для выполнения полных сборок вам также понадобится Ruby, поскольку для создания веб-сайта используется драгоценный камень jekyll.
@fluffy-spoon/substitute
на NPM).