Como um companheiro da minha série de blogs sobre estruturas de zombaria e como elas funcionam, esse repositório tenta implementar os mesmos testes de unidade com simulação usando cada uma das principais estruturas de zombaria disponíveis para .NET.
Este projeto deve ser uma referência para quem deseja comparar estruturas de zombaria .NET ou ver exemplos de sintaxe para uma determinada estrutura. Não se pretende ser uma referência exaustiva, não é que seja o Gaureenteed sem erros (mas informe-me se encontrar algum problema).
Para escrever testes, precisamos de algum código que precise de testes. Assim, eu criei o LunchNotifier , uma classe um pouco mais do que o Hello-Hello, contra a qual os testes de unidade (com zombarias) podem ser escritos.
Um dos benefícios fornecidos para empilhar o transbordamento emplpoyees que trabalham no escritório de Nova York é o almoço gratuito de chefs internos. Todos os dias, quando os cozinheiros concluíram a preparação da refeição, uma notificação vai para os funcionários do escritório para que eles saibam que a comida está disponível.
No projeto CodeBeingTested , a classe LunchNotifier é a nossa principal meta.
Esta aula tem cinco dependências externas que precisam ser ridicularizadas para realizar nossos testes:
INotificationService (injetado via construtor)ILogger (injetado via construtor)IEmployeeService (injetado via construtor)IEmployee ) baseados no escritório de Nova YorkIEmployee (retornado do IEmployeeService )System.DateTime A lógica principal está no LunchNotifier.SendLunchtimeNotifications() . Este método inclui uma chamada em linha para System.DateTime.Now , que não é zombada por estruturas contornas como MOQ ou Rhinomocks:
public void SendLunchtimeNotifications()
{
var now = DateTime.Now;
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
Uma implementação alternativa é fornecida para uso por molduras contornada no LunchNotifier.SendLunchtimeNotifications_DateTimeSeam() , onde a chamada para DateTime.Now foi extraída em seu próprio método, que pode ser substituído em uma simulação:
public virtual DateTime GetDateTime() => DateTime.Now;
public void SendLunchtimeNotifications_DateTimeSeam()
{
var now = GetDateTime();
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
Cada um dos projetos restantes tenta implementar um conjunto semelhante de testes de unidade em relação ao LunchNotifier usando diferentes estruturas de zombaria.
Todos os testes são gravados usando o NUNIT v3.10 por meio do pacote NUGET.
Em alguns casos, existem várias maneiras de abordar um teste usando a estrutura de zombaria, por isso forneci várias variantes do teste para mostrar as diferentes abordagens.
Este teste cria um funcionário simulado "BOB" que prefere notificações por e -mail e usa zombarias para garantir que a lógica LunchNotifier envie um e -mail quando o almoço estiver pronto.
Este teste cria dois funcionários simulados, "Bob" e "Martha" e garante que, se o envio de uma notificação para um deles resultar no erro de ser registrado e não impede que os funcionários restantes sejam notificados.
Este teste usa a sintaxe do Nunit TestCase para executar dois casos de teste, um antes das 13h e outro depois das 13h, para garantir que o modelo de notificação apropriado seja usado com base na hora do dia.
Para estruturas sem restrições, DateTime.Now pode ser controlado diretamente para retornar o tempo de entrada do teste, no entanto, as estruturas restritas não podem, portanto, elas devem extrair a chamada para DateTime.Now Assim, a necessidade da variante SendLunchtimeNotifications_DateTimeSeam .
Tipo: restrito
Projeto: https://github.com/moq/moq4/wiki/quickstart
NUGET: https://www.nuget.org/packages/moq/
Tipo: restrito
Projeto: https://github.com/hibernating-rhinos/rhino-mocks
NUGET: https://www.nuget.org/packages/rhinomocks
AVISO: Rhinomocks é efetivamente um projeto morto e provavelmente não fornecerá suporte para mudanças futuras no .NET, como o .NET Core. Eu não sugiro que você comece a usar essa estrutura se ainda não a estiver usando.
Para executar esses testes, você deve ter o VS2017 Enterprise (ou equiv) instalado.
Tipo: restrito
Projeto: http://nsubstitute.github.io/
NUGET: https://www.nuget.org/packages/nsubstitute
Tipo: sem restrições
A Microsoft Fakes vem como parte do Visual Studio 2017 Enterprise ou do Visual Studio 2015 Ultimate e não está disponível como um componente de Speate.
A Fakes não suporta de forma nativa a validação de estilo AssertWasCalled , por isso utilizo um pacote Nuget adicional (para o qual eu contribuí) para fornecer esse recurso: Fakes.Contrib / Nuget
Tipo: sem restrições
Informações do produto: https://www.typemock.com/isolator
Este produto requer uma licença paga (há um teste gratuito de 15 dias disponível) para fazer zombaria sem restrições. O TypeMock foi bom o suficiente para me fornecer uma licença comunitária gratuita, para que eu possa trabalhar em projetos como este.