Visite o site do NSubstitute para obter mais informações.
NSubstitute foi projetado como um substituto amigável para bibliotecas de simulação .NET.
É uma tentativa de satisfazer nosso desejo por uma biblioteca simulada com uma sintaxe sucinta que nos ajude a manter o foco na intenção de nossos testes, e não na configuração de nossos testes duplos. Tentamos tornar as operações necessárias com mais frequência óbvias e fáceis de usar, mantendo cenários menos usuais detectáveis e acessíveis, e ao mesmo tempo mantendo o máximo de linguagem natural possível.
Perfeito para quem é novo em testes e para outros que gostariam apenas de escrever seus testes com menos ruído e menos lambdas.
Se você tiver dúvidas, solicitações de recursos ou comentários sobre o NSubstitute, levante um problema no site do projeto. Todas as perguntas são bem-vindas no site do nosso projeto, mas para perguntas do tipo "como fazer", você também pode experimentar o StackOverflow com a tag [nsubstitute], que geralmente leva a respostas muito boas da comunidade de programação em geral. StackOverflow é especialmente útil se sua dúvida também estiver relacionada a outras bibliotecas com as quais nossa equipe pode não estar tão familiarizada (por exemplo, NSubstitute com Entity Framework).
Digamos que temos uma interface básica de calculadora:
public interface ICalculator
{
int Add ( int a , int b ) ;
string Mode { get ; set ; }
event Action PoweringUp ;
}
Podemos pedir ao NSubstitute para criar uma instância substituta para este tipo. Poderíamos pedir um stub, mock, fake, spy, test double etc., mas por que nos preocupar quando queremos apenas substituir uma instância sobre a qual temos algum controle?
_calculator = Substitute . For < ICalculator > ( ) ;
virtual
de classes. Tenha cuidado ao substituir aulas por membros não virtuais. Consulte Criando um substituto para obter mais informações.
Agora podemos dizer ao nosso substituto para retornar um valor para uma chamada:
_calculator . Add ( 1 , 2 ) . Returns ( 3 ) ;
Assert . That ( _calculator . Add ( 1 , 2 ) , Is . EqualTo ( 3 ) ) ;
Podemos verificar se nosso substituto recebeu uma ligação e não recebeu outras:
_calculator . Add ( 1 , 2 ) ;
_calculator . Received ( ) . Add ( 1 , 2 ) ;
_calculator . DidNotReceive ( ) . Add ( 5 , 7 ) ;
Se nossa afirmação Received() falhar, NSubstitute tenta nos ajudar sobre qual pode ser o problema:
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*)
Também podemos trabalhar com propriedades usando a sintaxe Returns que usamos para métodos, ou apenas ficar com os antigos configuradores de propriedades (para propriedades de leitura/gravação):
_calculator . Mode . Returns ( "DEC" ) ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "DEC" ) ) ;
_calculator . Mode = "HEX" ;
Assert . That ( _calculator . Mode , Is . EqualTo ( "HEX" ) ) ;
NSubstitute oferece suporte à correspondência de argumentos para definir valores de retorno e afirmar que uma chamada foi recebida:
_calculator . Add ( 10 , - 5 ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Any < int > ( ) ) ;
_calculator . Received ( ) . Add ( 10 , Arg . Is < int > ( x => x < 0 ) ) ;
Podemos usar a correspondência de argumentos, bem como passar uma função para Returns() para obter mais comportamento do nosso substituto (possivelmente demais, mas a decisão é sua):
_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() também pode ser chamado com vários argumentos para configurar uma sequência de valores de retorno.
_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" ) ) ;
Finalmente, podemos gerar eventos em nossos substitutos (infelizmente o C# restringe drasticamente a extensão em que essa sintaxe pode ser limpa):
bool eventWasRaised = false ;
_calculator . PoweringUp += ( ) => eventWasRaised = true ;
_calculator . PoweringUp += Raise . Event < Action > ( ) ;
Assert . That ( eventWasRaised ) ;
NSubstitute e seus testes podem ser compilados e executados usando Visual Studio, Visual Studio Code ou qualquer outro editor com suporte .NET. Observe que alguns testes estão marcados como [Pending]
e não devem ser aprovados no momento, portanto, é uma boa ideia excluir os testes na categoria Pendente das execuções de testes.
Também há scripts de construção no diretório ./build
para compilações de linha de comando e configurações de CI na raiz do projeto.
Para fazer compilações completas você também precisará de Ruby, já que a gema jekyll é usada para gerar o site.
@fluffy-spoon/substitute
no NPM)