Desenvolvimento orientado para testes com . NET Core | Trevoir Williams | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Desenvolvimento orientado para testes com . NET Core

teacher avatar Trevoir Williams, Jamaican Software Engineer

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Introdução

      5:14

    • 2.

      Crie projeto de teste

      7:25

    • 3.

      Teste de unidade: crie teste de unidade com base nos requisitos

      15:40

    • 4.

      Implemento: escreva código para retornar os dados corretos

      3:31

    • 5.

      Refactor: código de teste e implementação

      7:04

    • 6.

      Revise a lista completa de requisitos com projetos no GitHub

      5:56

    • 7.

      Teste e implementação: exceção quando a solicitação for nula

      7:52

    • 8.

      Crie serviços de reserva

      4:05

    • 9.

      Teste de unidade: salve uma reserva de quarto

      12:50

    • 10.

      Implemento: salve uma reserva de quarto

      8:52

    • 11.

      Teste de unidade: verifique se há espaço disponível

      6:34

    • 12.

      Implemento: verifique se há espaço disponível

      6:25

    • 13.

      Teste e implementação: adicione identificação de sala ao resultado

      5:22

    • 14.

      Teste e implementação: retorno ao resultado de reserva bem-sucedido ou falhado

      9:32

    • 15.

      Teste e implementação: adicione ID de reserva ao resultado

      6:27

    • 16.

      Revisão de seção

      1:35

    • 17.

      Projeto Refactor para camada de acesso a dados

      11:02

    • 18.

      Teste de unidade: obtenha salas disponíveis

      13:50

    • 19.

      Implemento: obtenha salas disponíveis

      9:31

    • 20.

      Teste e implementação: salve uma reserva de quarto

      7:45

    • 21.

      Revisão de seção

      3:18

    • 22.

      Entenda os testes de unidade . Aplicativos NET Core

      10:27

    • 23.

      Configurar o armazenamento de dados na memória do Sqlite

      4:08

    • 24.

      Crie cenários de teste de unidade

      11:32

    • 25.

      Implemente código para testes

      16:32

    • 26.

      Faça um teste e corra para o aplicativo ASP.NET Core

      9:14

    • 27.

      Revisão de aulas

      4:06

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

72

Estudantes

--

Projeto

Sobre este curso

O desenvolvimento orientado para testes (TDD) é uma abordagem poderosa para criar software sólido e robusto. Neste curso, você vai aprender as habilidades que precisa para ser capaz de aplicar o TDD em seu . Projetos NET. O teste de unidade é um tipo de teste de software em que o código é escrito para automatizar o teste de subseções de um aplicativo inteiro. Esta metodologia oferece uma cobertura mais funcional e reduz a necessidade de testes de regressão manual quando o código do aplicativo muda. O objetivo é validar que cada unidade do código de software funciona conforme o esperado.

Você vai descobrir o básico do teste de unidade e sobre o ciclo vermelho-verde-refatoração. Você também vai aprender como testar e implementar a lógica de negócios em um . Aplicativo NET Core usando o xUnit como uma estrutura de testes e o Moq como uma biblioteca de simulação.

Após este curso, você terá conhecimento fundamental de desenvolvimento orientado a testes que ajudará você à medida que avança para testar e implementar novas funcionalidades em seus projetos de C#. Você terá as habilidades e o conhecimento para criar um aplicativo ASP.NET Core testável e passível de manutenção, necessário para arquitetar empresas no mundo real. Aplicativos NET Core.

Crie uma base sólida em testes de unidade em . NET:

  • Use projetos de teste do xUnit

  • Use o Moq e o Shouldly para escrever testes de unidade

  • Projetos no GitHub para acompanhar requisitos
  • Conduza o desenvolvimento orientado para teste (TDD) em vermelho, verde e refatorador

  • Pratique o desenvolvimento orientado por testes em código real

  • Aprenda a escrever código testável

  • Entenda como escrever testes de unidade e depois criar ou refatorar código

  • Analise armadilhas para evitar e desafios comuns

O Course está completo com arquivos de trabalho hospedados no GitHub, com a inclusão de alguns arquivos para facilitar a replicação do código que está sendo demonstrado

Conheça seu professor

Teacher Profile Image

Trevoir Williams

Jamaican Software Engineer

Professor

Habilidades relacionadas

Desenvolvimento Desenvolvimento web
Level: All Levels

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. Introdução: Bem-vindo ao desenvolvimento orientado por testes no dotnet Core, o manual. Sou seu instrutor de viagem ou Williams e sou engenheiro de software e literatura por mais de uma década. Agora você provavelmente está curioso por ter visto o título do curso e você está se perguntando o que exatamente é o desenvolvimento orientado por testes? Bem, ele desenvolvimento orientado por testes é um processo de desenvolvimento de software que depende de requisitos sendo escritos como casos de teste antes de código real ser escrito. Então é isso mesmo, você leu isso certo? Fazemos os testes da unidade. Primeiro. Sei que o teste de palavras foi o que o levou a este curso. E você está olhando para o teste de palavras, eu estou pensando, ok, eu sei um pouco sobre o que são testes de unidade, mas eu não tenho necessariamente certeza de como eu posso usá-los em meu código. Bem, este é o curso perfeito para você. Então TDD é um processo de garantir que escrevemos código testável e é modular o suficiente e é simplesmente o suficiente para fazer a tarefa. É também um processo que garante que temos cobertura máxima de código. Então, quando fizermos mudanças de quebra e mais tarde no código, não haverá necessariamente quebra, mas elas se encaixarão bem. Agora temos o que chamamos de ciclo de desenvolvimento orientado por testes. Neste ciclo, fazemos o nosso teste vermelho, significa que escrevemos o teste unitário. Não há código, nenhum código de suporte, mas à medida que modelamos no teste, temos que criar todos os artefatos que seriam necessários no código real de qualquer maneira. Então, isso nos ajuda com nossa API inicial ou conceitos de design de código inicial. Então escrevemos o código demais os testes que escrevemos. Então nós escrevemos um teste para corresponder ao requisito em nenhum lugar escrevendo o código para coincidir com o teste. E então o resultado final disto seria que escrevêssemos o código para combinar com o teste e testássemos novamente e obtivéssemos um teste verde. Então o teste vermelho significa que ele falha. Não há código para suportar este teste. Escrevemos o código e testamos novamente, e este teste agora deve passar. Então isso significa que o código que escrevemos agora vai cumprir o requisito para o qual o teste foi escrito. Então, à medida que fazemos isso e ou requisitos crescem ou nossa compreensão do que precisa ser implementado melhora. Nós refatoramos e repetimos esse processo. Agora, muitos desenvolvedores teste de unidade Nobel, mas não muitos desenvolvedores realmente praticá-lo. Religiosos, eles são praticados na medida em que eles precisam. 1, ele diz para você escrever código testável. Você sempre vai ser pensável escrevendo seu código de uma maneira que eu possa testar diferentes aspectos dele sem ter que se preocupar em uma maneira que eu possa testar diferentes aspectos dele inicializar ou zombar de muitas coisas ao mesmo tempo. Mas todas as coisas são injetáveis. Então ajuda a impor o que chamamos de princípios sólidos desde o início. Ele geralmente leva a um código muito mais limpo e sucinto e geralmente envolve você colocar em práticas adequadas ao escrever seu código. Além disso, você recebe feedback quase instantâneo sobre se seu código funciona ou não porque você está indo apenas para fazer um teste automatizado contra um caso de teste. Então você cria um cenário em que seu teste deve passar, provavelmente um onde se os dados estavam, mas deve fazer isso. Você apenas cria seus cenários e recebe feedback instantâneo. Os cidadãos têm que esperar quanto tempo para que um aplicativo carregue para cima. E então você coloca os valores e, em seguida, você vê o feedback. Você pode automatizar essas coisas e isso reduzirá muito a quantidade de tempo que você gasta testando e testando novamente o código. Agora, com tudo isso dito, há desvantagens e algumas delas incluem o fato de que é demorado porque você está escrevendo o dobro do código que você provavelmente teria se você estivesse apenas escrevendo o código desde o começo. Também pode ser difícil para iniciantes para obter o inicialmente, mas hey, é por isso que estamos todos aqui agora este curso é muito amigável para iniciantes. Você aprende a usar a unidade ECC para fazer projetos de testes manter para usar bibliotecas de terceiros para tornar os testes e asserções muito mais fáceis. Vamos olhar para como fazemos todo o ciclo de teste. Então vamos escrever testes, em seguida, implementar o código, e então nós somos fator à medida que a aplicação cresce e olhamos apenas para o desenvolvimento orientado para testes e lançar este curso, vamos rever algumas das armadilhas, mas finalmente queremos para apenas aumentar suas habilidades de teste de unidade e ajudá-lo a ter uma apreciação de por que é importante e como isso pode ser feito com a máxima eficiência. Agora, uma prévia rápida do que vamos fazer. Primeiro, vamos construir uma aplicação de verdade. Não será o aplicativo mais complicado, mas será o suficiente para que possamos ver como diferentes níveis de testes unitários podem funcionar, como ele evolui ao longo do tempo, e alguns dos níveis básicos ou altos Requisitos artefato, aquele, É um pedido de reserva de quarto. Então eu tenho que colocar em lógica para governar. Todo o quarto está reservado, o que é solicitado, que tipo de feedback o aplicativo vai dar. E vamos eventualmente conectar-se a um banco de dados. Então precisamos ter certeza de que todas essas conexões funcionem. Então, eu estou dizendo a vocês que no final deste curso, nós teríamos construído algo próximo ao que nosso aplicativo corporativo real seria parecido. E teríamos feito isso usando o desenvolvimento orientado por testes. Então, com tudo o que foi dito e feito, este é um desenvolvimento orientado por testes com dotnet Core, o manual. E mal posso esperar para te ver no curso. 2. Crie um projeto de teste: Certo pessoal, então vamos continuar neste curso e vamos começar criando projetos de artistas. Então, se você ainda não tem o Visual Studio, ele pode ir em frente e obter 2019 são a versão mais recente disponível para você no momento desta gravação. Mas o que vamos fazer é ir em frente e criar um novo projeto. E queremos uma unidade x testes projetos ou apenas uma busca por x unidades. Agora, apenas note que sim, estamos usando x unidade para este curso. Mas os princípios gerais de testes de unidade podem ser aplicados a um projeto de unidade final ou até mesmo a um projeto de teste Microsoft regular. Porque se você apenas digitar teste ou um projeto de teste, eu tenho certeza que você verá MSTest. Lá vamos nós. E projeto de teste de unidade, bem como os projetos de testes de unidade X. Então eu vou mostrar a vocês usando x unidades, mas os princípios gerais de testes unitários permanecerão verdadeiros. Então vamos em frente e acertar unidades H. E vamos chamar esta sala de projeto reservando ponto core, ponto. Então quarto bulking up nome do aplicativo. Core vai ser onde temos toda a lógica de negócios. Então eu estou apenas chamando de ponto core, mas então nós estaremos escrevendo testes de unidade em torno do projeto central. Para o nome da solução. Vamos renomear isso. Então, eu só vou dizer reserva de quarto, isso é solução, mas agora estamos apenas lidando com um projeto de teste. Então, novamente, vá em frente e crie esses, aperte Avançar. E sim, estamos usando dotnet cinco vezes desta gravação. Se houver uma pequena versão e sinta-se livre para usá-lo, o que provavelmente seria feito às seis. E então vamos em frente e clique em Criar. Então o resultado final dessa atividade é a nossa obtenção deste novo quarto de projeto reserva dot core dot testes. Também obtemos esse arquivo padrão chamado unittest one. Agora eu estou todo em escrever um teste de unidade neste vídeo em particular, mas nós vamos percorrer certas configurações que a coisa apenas vai facilitar para nós avançarmos. Eu também vou olhar para o básico do que é um teste de unidade. Então a primeira coisa que eu vou fazer é clicar com o botão direito do mouse em nosso arquivo de projeto para o projeto de teste e ir para Propriedades. E o que eu vou fazer é mudar o namespace padrão. Às vezes, meu Visual Studio superfície glitchy do switch 15 guias. Mas nós vamos mudar o namespace padrão para Booking dot core, alguém para remover isso porque o que acontece é que ele realmente torna mais fácil compartilhar recursos entre os projetos, o projeto de teste, e o verdadeiro ponto core projeto quando ele fica online. E se eles têm o mesmo namespace, então é fácil compartilhar os recursos que definitivamente precisarão ser compartilhados entre os dois. Então eu só estou me certificando de que tudo está bem com isso e então eu posso salvar e fechar isso. Eu disse configurações, mas essa é a única que precisamos pelo menos, certo? Não. Então, em termos do básico de um teste de unidade, você percebe que um, temos essa anotação acima do método chamado gordura. Agora isso é o que diz ao IDE, o programa tudo que isso é apenas um teste de unidade, fator isso em todo o tempo de execução do aplicativo. É uma unidade de testes. Então, sempre que estamos escrevendo testes de unidade, vamos querer pelo menos ter esta anotação que diz gordura. E outra anotação que vamos analisar é a teoria. Mas chegaremos lá eventualmente. Então esse é o passo número um. A próxima coisa a notar é que um teste de unidade geralmente tem três passos para ele. Você tem a laranja, nós temos o coração, e depois temos afirmação. Então, de modo geral, os Iranges onde você prepara todos os dados, você prepara seus artefatos de teste. Você sabe, sempre que você está indo para testar algo usando uma interface de usuário, geralmente sabe um valor que você precisa colocar em para obter o tipo de resposta para qualquer resultado que você está testando para. Então é isso que eles são organizados parte é para frente quando criar objetos são representações de quaisquer dados que esperaríamos para ser testando contra. Então é isso que fazemos, nós os criamos. Então nós vamos otimizar em qualquer lugar quando realmente simular uma chamada para o método que esperamos deve ser chamado quando nós executar tal ação, então nossas asserções null seria o que ver se o teste vai passar ou falhar. Porque então teremos que afirmar que esta é a coluna antiga com esta entrada para este método. Ou aconteceu? Isso não aconteceu? Então, se dissemos que isso deveria acontecer e não aconteceu, esse teste basicamente sentirá. E então é quando teremos que escrever o código para torná-lo verde ou ele sentiria que são o papel do tribunal e executou o teste. Isso significa que provavelmente há algo errado com o código ou algo errado ao longo do caminho. Então é basicamente assim que funciona um teste unitário. Essa é apenas a teoria. E eu não estou tentando manter o mais simples possível para que você não pense que é muito difícil ou muito difícil conceituar como essa coisa vai funcionar. Bem, o Visual Studio torna muito fácil navegar através de testes porque eles nos dão um Explorador de Testes. E você pode chegar a este texto Explorador de Teste indo para Ver e, em seguida, clicando em Explorador de Teste ou fazendo Controle E e T. Então este Explorador de Testes é basicamente apenas vai ser uma interface que nos mostra todos os testes de unidade que estão pendentes todos os testes, projetos um, todos os testes de unidade em vez disso projetos AC temos teste de unidade 1, que é a nossa classe I lá temos test1, certo? E então nos permitiria fazer esses testes. Agora eu apenas cliquei em Executar, mas nada está acontecendo porque não há nada para correr. Então, essencialmente, sempre que escrevemos testes de unidade são propriedade de um determinado método, você realmente veria as propriedades de navegação chegando dentro do Visual Studio para mostrar qual método tem quantos testes, quantos testes estão falhando ou passando ideias, este método, etc. Outro benefício de grade dos testes de unidade em sua cotação é que você pode configurar o que chamamos de builds fechados em determinados pipelines de DevOps. Então, os pipelines de DevOps quando você queria desenvolvimento contínuo, integração contínua, você está trabalhando em uma equipe, pessoas diferentes enganaram em diferentes partes do código. Você quer garantir que quando alguém verifica em seu código que todos os testes de unidade que usam o trabalho ainda funcionem. E quaisquer novos, eles introduziram nossa política, desculpe que eles passam não trabalho. Como os biólogos dizem que eu queria ter certeza de que todos os testes estão passando antes que você permita que o novo código em um repositório central para toda a equipe. Então, testes de unidade podem atuar como um guarda contra isso. Então, com tudo o que foi dito e feito, mais uma vez, apenas um pouco de teoria, apenas um pouco de compreensão de por que estaríamos escrevendo testes unitários. E quando voltarmos, vamos ler nosso primeiro teste para nossa primeira exigência. 3. Teste de unidade: crie o teste de unidade com base em requisitos: Certo, pessoal, então vamos em frente e criar nosso primeiro teste de unidade. Nosso primeiro requisito é que quando um determinado método é chamado para processar a reserva, esperamos um certo tipo de resultados com todos os detalhes da reserva incluídos. Então esse é o nosso primeiro requisito que vamos atender. Agora, é claro, à medida que temos uma melhor compreensão de outros requisitos são aspas, blocos unaspas irão evoluir. Então vou fazer isso em um minuto. Blocos para que possamos ver como o código evolui, como refatoramos hall, testamos novamente e tudo o que repetimos, e basicamente como o ciclo funciona. Então, com tudo o que disse e fez o suficiente do meu monólogo, vamos começar. Então eu vou excluir o teste de unidade que estamos vendo atualmente e vamos criar uma nova classe. E eu fui chamar esse teste de processador de pedido de reserva de um quarto para descritivo, ou não há nada de errado em ser descritivo com seus nomes de classe. Quem olhar para a sua turma deve saber o que está acontecendo. Então este é um teste para nossos pedidos de reserva de quarto, o processador que pretendemos construir eventualmente. Então eu vou ir em frente e adicionar isso, conhecer o público da turma. E, dentro disto, vou ter um vazio público. Deverá devolver o quarto reservando um pedido. E é um método, é claro, não, eu queria pausar aqui e 0 que existem diferentes convenções ao nomear algumas pessoas, eles usam os sublinhados. Alguns DB2 não usam sublinhados. Eles preferem ter tudo caso CamelCase ou Pascal em vez. Portanto, existem convenções diferentes. Um pouco de Ebola, certo? Um para passar, outro para falhar, e você tem maneiras diferentes de se aproximar. Então eu só estou apontando, eu vou tentar e usar os sublinhados para a coisa que ele faz. Eu gostei dos sublinhados no conjunto de teste ou realmente que usá-los em qualquer outro lugar. Gosto de usá-los ao nomear meus métodos de teste. Você pode não, mas a questão é que você faz o que for confortável com você, desde que seu código seja legível. Tudo bem? Então, dentro deste teste, e mais uma vez é um teste, então temos que ter certeza de que damos nossos atributos, que é o ponto de controle Fox, para incluir o namespace ausente para x unidade. Lá vamos nós. Então isso pode ser outra coisa, essa anotação pode ser outra coisa se você estiver usando um projeto de teste diferente. Mas mais uma vez, estou focando em x unidades neste curso. Agora o que vamos fazer é o Shawn laranja fora de todas essas ameaças de teste, que é para criar nossos artefatos de teste. Então eu preciso de uma instância do processador real que precisamos testar. Então eu vou criar var quarto processador reserva, ou eu apenas chamá-lo processador, é igual a uma nova instância de algo que ainda não existe. Ok? Então, como fazemos com que exista? Bem, eu só vou fazer pontos de controle. Eu não quero dizer que ele gera a classe em um novo arquivo, então é isso. Vá em frente e crie isso para que seja nulo na existência. Você pode ir em frente e preenchê-lo com todas as propriedades que sabemos que ele vai precisar são os métodos que ele vai precisar. Bem, antes de eu fazer isso, o que eu vou fazer é RE em algum pecado, diarréia e fase Jean. Então, por que eu sou pensável os requisitos? Eu sei que é um pedido precisa vir e dois, eu preciso retornar algo com os mesmos valores do pedido que acabou de chegar. Este é o processador que vai lidar com a solicitação e fazer toda a lógica de negócios. Mas em última análise, eu sei que no meu arranjo eu preciso Mach como nossos pedidos serão. Então eu só vou dizer var solicitação de reserva é igual a uma nova instância off e eu só vou usar o pedido de reserva de quarto. E isso vai ter algumas propriedades. Então não importa o fato de que essas coisas não existem. Esse é um ponto de desenvolvimento orientado por testes. Modelando o quê? Então eu sei que o aplicativo vai precisar para completar certas tarefas, certo? Assim, o pedido de reserva é igual a novos pedidos de reserva de quarto. E isso vai ter ou os campos nome completo. E eu posso colocar em nome de teste. Então, mais uma vez, estes são testfile é que eles não necessariamente têm que ser percebidos o que eles precisam para ser realmente o suficiente para representar o que pode vir em. Então teste request.com. E então nós temos a data, que eu posso dizer é igual a colocar qualquer nova data, hora em que passamos no ano, no mês e no dia. Então é assim que isto vai parecer. Este objeto é objeto de solicitação de reserva. Então, depois de fazer tudo isso, eu posso saber dizer ponto de controle legítimo, não, ele deve criar um novo arquivo e olhar nosso Visual Studio tão inteligentemente fazendo isso é dizer gerar a classe com essas propriedades e eu vou dizer porquê. Obrigado. Eu gostaria muito que você fizesse isso. E eu posso pular e ter certeza de que tudo está bem com isso. E isso parece-me bem. Então vou voltar para os meus testes e continentes. Então eu tenho a classe do processador criado, eu tenho o cruzamento de solicitação criado. Não, eu preciso de um método que realmente processe o pedido. Estamos, mas vamos colocar isso dentro dos processadores. Então eu vou colocar que o processador vai ter um método, é claro que não existe. Mas será chamado de sala do livro, que aceitará o pedido. Tudo bem, então eu estou chamando meus métodos é R. Isto é o que eu pretendo chamar os métodos. Claro que eu poderia ter chamado este processo pedidos ou qualquer outra coisa, mas eu estou apenas tramando que vai preparar. Ele leva em nosso objeto de solicitação. E é suposto voltarmos, certo? Deveríamos voltar. Portanto, este devolveu pedidos de quarto, pedidos de reserva de quarto. Então eu vou dizer ou deve retornar resposta reserva quarto. E eu vou apenas dizer quais valores são com valores de solicitações. Acho que está claro o suficiente, Fred. Então, quem lê isso saberá que é para isso que o método está testando. Então isso significa que eu preciso de reserva de quarto, classe de resultados em outros chamados de resultados de objetos. E dizer que é igual a qualquer sala de livros que retornaria. que significa que a sala de livros deve devolver algo deste tipo, que não existe. Claro, mais uma vez, vou apenas controlar pontos e gerar este tipo em sua própria classe. Tudo bem, então está feito. Outra coisa a notar é que ainda não temos este método. Então este conjunto de pedidos foi um erro de digitação da minha parte. Então este deveria ter sido pedido de reserva e reserva nula nossa sala de livro. Eu fui para o ponto de controle e pedi-lo para gerar esse método. Não, ele pode inferir que tipo de dados o parâmetro precisa ser porque todas as falhas que estamos usando. Então eu peço desculpas por usar a variável errada lá. Ele devia ter reservado pedidos. Eles não são apenas um pedido. E quem é esse é o nosso método generativo. Isso parece bom, mas é claro que não está implementado. Então vamos rever o que fizemos até agora. Tudo isso pode ser considerado o alcance. Então nós organizamos dados de amostra. Estamos organizados um objeto do que precisamos testar. Então aqui é onde nós realmente chamamos o método e tentar obter os resultados. Então isso significa que isso é chamado de OK. Tudo bem. Então combinamos, então agimos não. Precisamos afirmar, então precisamos ter certeza de que nossas suposições são o que esperamos que aconteça é correto. E embora não são construídos em, há uma palavra-chave embutida para asserções em excedido chamado assert, certo? Mas, em seguida, há outras bibliotecas e eu vi, Eu iria mostrar-lhe um chamado em breve para que você possa clicar com o botão direito do mouse, saltar para você obter pacotes. E se você procurar astuciosamente, seria no topo da lista onde ele usa tipo de asserção fluente tipo de ferramenta de estilo, como você pode escrever seu código. Então eu realmente gosto de usá-lo ou basta ir em frente e instalá-lo. Claro, aceitando quaisquer termos e condições. E quando isso for feito, podemos voltar ao nosso código. Então eu queria mostrar a ambos a sintaxe diz, mas você pode tomar sua própria decisão sobre se eles gostaram da biblioteca ou não. Desculpe, quero usar o padrão, tudo bem. Então eu posso dizer “afirmar pontos”. E neste ponto ele deve retornar a resposta com valores. Então isso significa que eu sou mais obter MC, alguma resposta ou nosso resultado, certo? Então eu posso ver não nulo. Estou afirmando que qualquer objeto que eu queira não é nulo. Neste caso, quero afirmar que o resultado NÃO É nulo. Se eu estava usando um breve eu poderia dizer ponto resultado, mas então eu teria que adicionar uma instrução usando para o astuto. Então, basta ver usando deve link. Então eu posso olhar para o objeto que é que eu gostaria de colocar a asserção em e ver os resultados ponto. E eu posso ver deve e olhar para todos os métodos que você tem, certo? Portanto, deve ser nulo ou não deve ser nulo. Está bem, posso ver que não deve ser nulo. Isso também me permite colocar em mensagens personalizadas para que quando eu olho para segurar a execução de teste, eu possa ver exatamente o que falhou com base na mensagem que eu estou colocando dentro. Então é bem legal. Eu gosto e é flexível. De qualquer forma. Não vou aborrecê-lo com os tecnicalidades da afirmação contra a biblioteca de deveres. Só quero passar a atividade corretamente. Então, neste ponto, podemos afirmar que isso não deve ser anulado, queria ficar granular. E no final do dia ou afirmações são basicamente baseadas em qualquer base que você deseja converter para garantir que o código que você está testando é realmente testado corretamente. Então, as afirmações anuais de coisas podem ser diferentes da lista de afirmações de outra pessoa baseada no que eles acham que é importante. Mas, no final de contas, espero que todos consigam chegar a acordo sobre o que, no mínimo, deve ser afirmado ou abrangido com base no teste. Para que pudéssemos obter granuloma. Isso Aqueles ver com os valores de solicitação, certo? Então o nome do teste está explicando exatamente o que deve acontecer. Primeiro, a resposta não deve ser nula, tudo bem, então não deve suportar resposta e dois, lá com os valores de solicitação. Então isso significa que o que está no resultado também deve ser o que está na resposta. Então eu posso afirmar ponto e eu posso dizer igual ao pedido. E então sod este ponto, as reservas ou manter um cenário quests os pedidos de reserva. Acho que preciso renomear isso para solicitar. Bem, o pedido de reserva. Deixe-me fazer isso cometendo o erro. Então solicite esses pontos de controle e pouco, renomeie todos eles. Lá vamos nós. Pedir pontos, nome completo. E então podemos dizer resultados. O resultado do hotspot não tem nenhum campo nele porque ele também precisa ter as taxas CAM que a solicitação tem. Certo. Então, neste ponto, refatorar e eu nos certificamos de que seus resultados em sua busca. Eu gosto, não, não me importo que eu estou repetindo esses campos ainda. Vamos refatorar e é por isso que você tem a refatoração. Neste ponto. Só quero passar pelo teste, ter certeza de que está tudo bem. Tudo bem. Então eu quero afirmar que o nome completo no pedido é igual ao nome completo nos resultados. E posso fazer isso pelos outros campos. Basta duplicar essa linha com Controle D e C, e-mail deve ser o mesmo que e-mail e deve ser o mesmo como se você estivesse usando certamente. E eu vou apenas reorganizar o código aqui, então você diria algo como ponto de resultados e, em seguida, o campo, que deve ser nome completo, deve ser. Então deve ser. Lá vamos nós. E, em seguida, dentro disso, você coloca em qualquer que seja o resultado esperado ou resultado deve ser o mesmo que solicitar consideração. E é basicamente isso. Então, duas sintaxes diferentes, duas maneiras diferentes. E no final do dia, existem outras bibliotecas que você pode usar para ter provavelmente afirmações mais legíveis ou mais confortáveis. Mas isso é com você. Só estou mostrando suas opções. Eu gosto, como eu disse, esta é apenas a minha preferência que eu gosto inteiro. A sintaxe flui quando eu uso as asserções deve, certo? Então, para mim, eu posso apenas duplicar e então eu vou fazer a mesma coisa. e-mail do ponto de resultado deve ser o e-mail do ponto de solicitação e o ponto de solicitação d. deve ser isso. Então faça sua escolha, que preferir. Agora, se eu olhar para tudo isso depois de uma construção, eu vejo que foi um sucesso. Então eu não tenho erros de sintaxe ou qualquer coisa. E eu sei que ter teste ACT com classe real não é nada implementado ainda, certo? Então não, eu posso fazer o teste. Eu posso clicar neste pequeno indicador aqui e eu posso clicar em Executar. Então eu posso fazer isso a partir daqui, ou eu poderia iniciar o meu Explorador de Testes para executar o teste a partir daí. Bem, é apenas clicar em Executar, que iniciará estatísticas para. E vemos aqui que temos um teste fracassado. Então leia testes por causa do indicador System.Out não implementado exceção. Então, em outras palavras, ele está tentando chamar o método, mas não é implementado. Por que razão é dada essa excepção específica? Isso é porque se passarmos para o método e eu só usei se 12 para saltar, então vemos aqui que o, ele tem um teste associado a ele e não está passando e através da exceção não implementada. Tudo bem, então quando voltarmos, vamos realmente escrever o código aqui que quando executarmos o teste, devemos chegar pelo menos até as afirmações e então podemos ver como elas se parecem. 4. Implementação: código de escrita para devoluções de dados corretos: Ei pessoal, da última vez que estivemos aqui, estávamos escrevendo nossos testes e nulo, estamos voltando para mim neste teste raiz, ganância. Então, apenas como uma recapitulação, estamos escrevendo um teste que deve retornar a resposta reserva de quarto com o corpo pedido é Isso é o que artistas cenário é. E nós organizamos algumas solicitações pobres, que compreende os campos e-mail, fullname, e solicitações D ele, temos nosso processador que ainda não está implementado, ou temos o arquivo, mas a sala de livro método ainda não foi implementado, mas temos certas afirmações que vimos sentir quando executamos esse teste. Nós também olhamos para as duas maneiras que você pode fazer afirmações. Esta é a maneira natural que sai da caixa dentro das unidades. E eu introduzi uma nova biblioteca chamada brevemente, que meio que traz até um tipo de afirmação fluente a ela. Você também tem outras bibliotecas de asserções, como afirmações fluentes, e há outras, mas como eu disse, você escolhe uma e você fica com ela se você se sentir confortável com ela. Sem problema. Então o que estamos aqui para fazer é implementar nosso método de sala de livros. Agora o teste, certo, nenhum requisito que queremos escrever código para é certificar-se de que o que é retornado como resultado tem todos os valores que estavam em solicitações. O que nos faz ter uma implementação simples realmente. Então tudo o que realmente temos que fazer é retornar uma nova instância do resultado da reserva de quarto onde seus campos, nome completo seria igual ao pedido, pontar o campo ou pedidos de reserva ou outro ponto o campo com o mesmo nome. E agora esses duplicados e, em seguida, fazer a mesma coisa para data e a mesma coisa para e-mail, havia baixo. Então, no final disso, tudo o que realmente precisamos ver é que ele está retornando algum objeto que atenda às nossas afirmações. Tudo bem, então com isso feito, vamos fazer nosso teste novamente. E voilá, agora temos um teste verde. Então você verá aqui que está indicando que um teste fora um está passando. Então nossas afirmações de teste não funcionam. Então, se eu fosse comentar todas essas afirmações e executar o teste novamente, você veria que ele funciona muito bem. Então, se você afirmar luz isso ou você usar em breve e tipo deste estilo, eles vão funcionar da mesma maneira. Então isso é realmente tudo o que há para implementar código neste ponto, o estágio, pelo menos para ter nosso teste, BI green test. Então, uma vez que uma pausa bem aqui, e quando voltarmos, estaremos refatorizando o código como nossa pré-visualização fora, por que precisamos voltar e refatorar um. Você viu que temos pedidos, então temos resultados. Ambos são idênticos, certo? Isso é uma ferramenta. Temos o processador sentado no mesmo projeto de teste que o teste. Nenhum desses recursos, que são os recursos reais para o aplicativo, deve realmente estar dentro do projeto de teste. Então nós vamos voltar e vamos refatorar nosso projeto e afastar o que precisa ser movido embora, se corrigir todas as referências e corrigir o código para que haja menos repetição ao redor. 5. Refactor: código de teste e implementação: Bem-vinda de volta. Vamos começar nossa refatoração. Então lembre-se que o ciclo é que escrevemos o teste, é vermelho. Escrevemos o código para mim, o grau de teste em, e então refatoramos se precisarmos, porque às vezes entre as duas atividades podemos repetir código ou colocar arquivos de trabalhos onde ele não deve necessariamente ser nulo. Na verdade, vamos reorganizar um projeto para transportar. Sabemos que é suposto parecer e como tem de olhar para a frente. Tudo bem, então o que eu vou fazer é criar outra biblioteca de classe. Então, vamos apenas adicionar um novo projeto. Vai ser a biblioteca da turma. E eu tenho o meu para o lado ou para a frente, mas estamos lidando com bibliotecas da classe C-Sharp. E eu realmente vou apenas nomear este quarto reservando ponto core. Então este é o ponto core testes, resumindo a biblioteca ponto core agora. Então, em seguida, deixe o dotnet cinco. E quando isso é criado, podemos ir em frente e remover o arquivo padrão classe um. Depois de fazer isso, o que vamos fazer é pegar toda a fossa que saberíamos que precisamos, e eu vou cortá-las e colá-las dentro do nosso projeto principal. Então lembre-se que desde o get-go, nós tínhamos dito que o namespace para os doctests core, o namespace padrão que tínhamos dito ser core. Bem, é por isso que olhem para aquilo. É como um plug and play. Tudo simplesmente passou sem problemas. Então, se olharmos para os arquivos de código vai ver que eles se encaixam direito com os namespaces como eles foram criados. Tudo bem, no entanto, você vai notar que temos um monte de linhas vermelhas no teste. É como se não os pudesse ver mais, certo? E por razões compreensíveis. Então o problema aqui é que eles atualmente têm o fluxo interno e interno significa que o namespace, qualquer coisa dentro do mesmo neon CSR dentro da mesma montagem, em vez disso, pode ver que é o que nada mais pode. Então é por isso que eu fui para conhecê-los público, porque bem, fora dos testes, nós precisaremos acessar eles externamente, então eu vou torná-los públicos. E quando voltarmos ao nosso teste, veremos que ainda temos um problema e isso é porque precisamos de uma biblioteca para. E então eu clique com o botão direito do mouse nas dependências e no projeto de teste e referências do projeto. E, em seguida, vamos apenas adicionar esse clique na biblioteca de classe, Ok. E então está tudo bem. Lá vamos nós. Agora isso está dizendo que ele não pode ver esse método devido ao seu nível de proteção. Então, mais uma vez, isso seria porque isso é interno. Então isso significava que público. E então todo mundo pode ver todo mundo e todo mundo está feliz. Agora podemos ir para baixo outra raiz de separar tudo estão refinando o layout do nosso projeto. Portanto, a separação de preocupações não é apenas sobre a criação de arquivos de classe individuais, mas também é certificar-se de que as classes são os ativos que estão relacionados entre si, estão localizados em um local central. Então sim, tudo reserva de quarto, que não é o artista está no mesmo projeto. Mas então temos o que eu poderia chamar de modelos, nossos modelos de domínio aqui, separados do Huan real com os mitos e realizando um processo, alguém para criar um pouco mais de separação aqui. E eu queria chamar isso de processadores, processadores em crianças que têm mais processadores e o trono os colocou lá. E neste também deseja adicionar um domínio. Ou podemos chamar isso de modelos, então chamamos de modelos em vez de domínio. Tudo bem, e então eu vou mudar isso para modelos. E eu fui mover o processador para a pasta de processos. Saiba que a conseqüência disso é que temos que mudar o namespace. Então eu vou muitas vezes chamar isso de modelos de pensamento e fazer o mesmo aqui. E, em seguida, para o processador, eu vou ter que chamar este um processador Box. Lá vamos nós. Então tudo está vendo, ele pode encontrar a referência. Então isso é porque você tem que ter certeza de que temos o novo uso. Então eu vou apenas copiar isso usando declaração, saltar para o nosso teste. E eu vou apenas acrescentar que usar Steven faz um como o único para os processadores. Tudo bem, então agora todos podem ver todos os outros. Então, se fizermos mais uma só para ter certeza, então as compilações são bem-sucedidas e deixe-me apenas executar nossos testes mais uma vez. Vou apenas clicar com o botão direito do mouse e dizer Executar teste. E os testes ainda passam. Então isso é bom. Agora, antes de seguir em frente, vou mostrar algumas ferramentas de produtividade, algumas configurações no Visual Studio que podem ajudar na produtividade. Primeiro, você sempre pode usar esse atalho para executar a liberdade de código. Então, quando você tem estes usando instruções que você não quer apenas clicar nele, segure em Control e pressione a tecla e, em seguida, E. Mas ele apenas remove e corrige o recuo em todas essas coisas, tornando tudo o que você precisa. Há maneiras de personalizar seus próprios padrões para o aspecto de uma limpeza, mas eu não vou entrar nesse nulo. Outra dica legal ou duas outras dicas legais que vou compartilhar com você, certo? Não. Envolve você indo para Ferramentas, Opções, indo para editor de texto, C-sharp, avançado. E então você pode habilitar na margem de herança show que será útil mais tarde como nossa obrigação e expande e teremos mais abstrações e assim por diante. Então isso realmente vem a calhar, especialmente quando você está lidando com grandes projetos com muitas obstruções. E outro que você achará útil é a pasta. Onde é que está? Em usar? Lá vamos nós. Adicionar Ausente usando seus ativos na pasta. Então isso significa que se você tem que copiar e colar código, digamos que em uma cópia e cole este bloco de código em um novo arquivo, ele irá adicionar automaticamente o uso para solicitações de reserva, que será que usando para que você não tenha que sentar e tente controlar os dados e preencha todas as coisas que faltaremos. Ele faz isso automaticamente. Então eu acho que essas são duas boas ferramentas de produção. À medida que você refatora, você quer ser o mais eficiente possível. E quando você tem esses tipos de ferramentas que realmente ajudam você, nossa ajuda para reduzir a probabilidade de você cometer um erro ao longo do caminho. Então, agora que fizemos com sucesso nosso primeiro ciclo de testes, certo? Nós escrevemos, eu li testes, escrevi citações implementadas, e nós refatorado. Então, basicamente, apenas enxaguamos e repetimos. Então é isso para a primeira seção. É o nosso primeiro teste de unidade. Mas agora vamos entrar em alguns mais dos requisitos do sistema são os requisitos de aplicação e começar a pescar ou mais coisas são testes. Vamos ficar um pouco mais complicados. E nós só vamos nos divertir. Só vou dizer que estamos nos divertindo à medida que avançamos. 6. Revise a lista completa de requisitos com projetos do GitHub: Ei pessoal, bem-vindos de volta. Agora, nesta lição, vamos apenas pescar todos os requisitos para o aplicativo que precisamos construir. Você já passou pelo nosso primeiro ciclino. Temos um gosto por escrever o teste, implementar o código e depois refatorar. Então sabemos que temos duas peças centrais escritas para tudo o resto, mas precisamos saber exatamente o que precisamos fazer. Então, no repositório que eu já criei para isso. E você pode ir em frente e criar o repositório e você pode revisá-lo usando os links sexuais e código-fonte. Vamos saltar para projetos, alguém para criar nosso projeto no Git Hub, Criar Projeto. E eu vou nomear esses requisitos. Bem, deixe-me qualificá-lo um pouco mais espaço reservando requisitos traço são, Eu acho que a opção de descrição em pelo menos para nulo. E podemos escolher se queremos um Kanban básico. Kanban com comentários livro, alguém para escolher um modelo básico de projeto Kanban. Então vá em frente e crie o projeto. E este projeto básico Kanban vem com um pouco de layout para vermos que podemos inserir cartões com todos e marcar o que está em andamento e saber o que é feito. Então, apenas para o contexto, todo o fim de semana tipo de replicar este tipo de estrutura. Se eu clicar nos três pontos neste primeiro e dizer Editar nada, então vemos uma visualização do tipo de sintaxe que podemos usar. Uma faísca de cólon C no meio dá-nos esses efeitos de estrela. Se você usar legal, desculpe, asterisco, asterisco e tristeza e textos, você terá o negrito. Você recebe seu corpo de mensagens de sangue. Se você quer uma caixa de seleção, você só precisa de suas chaves quadradas. E então se você colocar um X lá, então ele vai interpretar como sendo verificado. Tudo bem, então isso é bom. Para Nodal. Vou remover as outras duas amostras. Alguém vai clicar nos três pontos, dizer Excluir, Nota clique OK, fazer a mesma coisa para este. Eliminar nós, está bem? E então, se quisermos adicionar uma nota, podemos clicar nesse sinal de mais. Então, o primeiro requisito que queremos é aquele que afirma o que já fizemos para dizer resultados de retorno com os mesmos valores que solicitações, possamos ir em frente e adicionar isso. Então, se você quiser, mais uma vez, você poderia editar, eu poderia colocar em caixas de seleção mesmo é uma que afirma o que já fizemos para dizer resultados de retorno com os mesmos valores que solicitações, possamos ir em frente e adicionar isso. Então, se você quiser editar mais uma vez, eu poderia colocar em caixas de seleção iguais. Então, para fazer isso, você quer ter um hífen para torná-lo como um ponto de bala, então você tem seus colchetes para torná-lo a caixa de seleção com um espaço nele, certo? Então isso é espaço de colchetes abertos, feche colchete. E então o verbiage real para a tarefa. Então, quando fazemos tudo isso e clicamos em Salvar nós, vemos que temos nossas caixas de seleção aqui listadas e que podemos sempre levar todas elas. Então nós já fizemos tudo isso. Então eu estou apenas, eu estou apenas mostrando a vocês como podemos usar a subtrair nossos requisitos para que você possa ir em frente e fazer isso. Bem, vou continuar adicionando os outros requisitos. Então eu fui em frente e apenas adicionei os outros. Então você tem os resultados de retorno de primeira ordem com o mesmo valor nossos mesmos valores como solicitação sai aqueles novo feito que já é, os outros seriam lançados exceção nula se a solicitação está vazia. Portanto, sempre que vamos aceitar o nosso pedido de reserva, precisamos ter certeza de que os valores que nossos dados estão dentro dessa solicitação antes mesmo de tentarmos a reserva. Então esse é outro requisito fundamental que precisamos atender. Podemos salvar registro de reserva de quarto. Então, vamos adicionar funcionalidade de banco de dados em breve. E precisamos ter certeza de que podemos fazer isso. Verifique a disponibilidade do quarto antes de tentar a reserva e armazene um registro com identificador de quarto, devolva a bandeira de sucesso nos resultados. Portanto, se a sua tentativa de reserva foi ou não bem-sucedida, precisamos ter certeza de que indicamos isso e realmente adicionar o ID do registro de reserva aos resultados. Então essas são as coisas que esperamos realizar. E vocês podem ver que eu realmente copiei e colei a lista de caixas de seleção da original em todos os outros. Então eu posso me livrar dessas bolas. Então, OK, e agora podemos seguir em frente. Então eu posso mover estes para o outro lado. Então, isto está feito. E o próximo que temos é lançar uma exceção. É lamentável que esteja listado desta forma. E não posso reordená-lo. Talvez eu não passe muito tempo com isso. Pelo menos sabemos onde estamos e vamos arrastá-los para o progresso cada vez que estamos prestes a começar o trabalho. Então é isso que eu comprei para especialmente alterar requisitos, é claro, você sabe, como projetos que sozinho ou requisitos por James, você tem o que você chama de escopo creep. E a visão do projeto é uma excelente maneira de manter o controle do que precisa ser feito. Você também pode combinar esse esforço com a guia Ocorrências, que permite adicionar novas ocorrências, que podem ser na forma da solicitação de grupo, solicitações de novos recursos. Você pode dar-lhes os rótulos, lâmpadas, documentação em duplicado primeiro, UDC, o que quer que seja. Então esta ferramenta é muito, muito poderosa. Eu recomendo que você gaste algum tempo aprendendo como ele pode ser usado em seus projetos. Mas isso não é, isso é um curso para outro momento agora nós só queremos nos concentrar em superar esses requisitos. Então, quando voltarmos, começaremos a trabalhar no próximo. 7. Teste e implementação: em lance Exception quando o pedido for null: Tudo bem, então estamos de volta ao nosso código sobre wearable para começar com o nosso próximo teste. Então eu só vou entrar em colapso aquele anterior. E então eu vou colocar meu efeito na notação. E desta vez vamos ter um vazio público. E o título do teste será deve lançar uma exceção para solicitações nulas. Então, com isso em mente, e eu vou apenas rever ou apenas lembrá-lo como o teste 3 se parece. Temos a laranja, temos a aplicação, e depois temos a afirmação. Conhecendo este teste, ele vê que não deve haver nenhuma solicitação ou o valor da solicitação deve ser nulo. Então eu não fui para iRange e você pede objeção. No entanto, vou precisar do processador. E então minha afirmação vai parecer algo como em uma quarta-feira que você deve deixar desta vez. Então vai ser um bom médico. Atira para que você tenha jogado um prego através de uma pia se usarmos Assíncrono, é claro, vamos falar com ela acabou de nos ensinar no AsyncTask o que outros usam jogar para nulo. E então eu dou a ele o tipo de exceção e ele deve lançar. Então eu gostaria em argumento, excepções nulas, argumento e toda exceção é o que estamos esperados para lançar porque estamos vendo que o argumento que foi passado para o método era nulo. Então deve lançar uma exceção. E depois abro o aparelho. E se você apenas olhar para o, olhar para os parâmetros é C, Esse é o seu guia. Você está guiando você, permitindo-nos assistir, você pode colocar dentro Então aqui eu vou fazer algo como um delegado. Então, dentro desses parênteses, eu vou fazer outro par de parênteses com a seta Lambda. E então eu vou colocar nesse processo não são chamada de sala do livro. Mas aqui vou dizer nulo, certo? Então nós estamos testando se o pedido aqueles em como nulo, então ele deve lançar um símbolo de exceção, certo? E se você estiver usando a pesquisa ou o nativo excedendo sua sintaxe, então isso seria praticamente da mesma maneira, exceto que isso diria afirmação, e seria lançamentos. Então você vê que eles são meio parecidos. Mas, mais uma vez, o conflito de escolha do usuário sempre se esforçou para mostrar o equivalente ao que estou usando, a variação astuciosa e todo o problema. Então isso é realmente artistas, nós queremos ter certeza de que se o argumento é nulo, que nós lançamos uma exceção, ou eu posso estender isso e realmente obter a exceção que está sendo lançada. Exceção é igual a. E então podemos fazer algumas outras afirmações são verificações para se certificar de que o exception.com assim nome param seria o que é comum contrariando a exceção, certo? Eu posso ver deve ou deve ser. E entre parênteses eu vou ver a palavra pedidos. Então, quando essa exceção é lançada, ela deve voltar com ver, oh, ela foi lançada por causa desse parâmetro, que neste caso deve ser solicitações sendo nulas. Certo, então é assim que nossas afirmações se parecem. Claro, se fizermos uma construção, você pode garantir que nada está quebrado. Se eu fizer meus testes, então nós obteríamos ou teste vermelho. E o que vou fazer é adotar o especialista em testes à minha direita. Acho que temos imóveis suficientes para ficarmos à direita e continuarmos bem, certo? Então, se olharmos através, vemos que ainda amamos o chefe de teste anterior e agora temos esse novo teste falhando. Tudo bem, então eu vou apenas ir em frente e implementar este ao mesmo tempo porque não é muito trabalho onde precisa adicionar algo para garantir que as coisas nunca são nulas. Então, saltamos para o nosso processador. E, em seguida, dentro de um método de formulário que agora tem pelo menos um dos dois testes falhando, podemos adicionar código para torná-lo PaaS. Então eu só vou dizer se o pedido ou reserva pedidos em vez disso, o nome do parâmetro. Então, bem ali, nós vamos reprovar uma afirmação também o que olhamos para ela. Então, se o pedido de reserva for nulo, certo? E em versões mais recentes de C afiado você pode realmente escrever é nulo. Então, se o pedido de reserva é nulo, então lançamos nova exceção argumento. E então para esse nome Param, eu vou ver um nome fora. Então você sempre quer ter certeza de que você manter suas coisas fortemente digitado, vez que isso vai para atuar, mas a string e adicionar uma string estática, Eu só estou me certificando de ver um nome. Direi que se esse parâmetro mudar, o refator é mais fácil. Tudo bem? Então vamos reexecutar este teste. E eu acho que uma das afirmações falhará independentemente e podemos olhar para essas mensagens de erro. Então, de repente afirmar exceção, direito, nome param, e então ele vendo deve ser pedido comprado foi reserva pedidos célula é uma vertente para mostrar que isso ainda falharia. Então, onde nós s, nós escrevemos o teste sim, código de sub-rotina que nós pensamos que funciona, mas, em seguida, com base no teste que nós escrevemos, ele ainda está falhando. Está bem. Por que está falhando? Porque estamos devolvendo o nome dos pedidos de bookend. Então, em outras palavras, onde o leitor retorna os pedidos de reserva de cordas aqui, certo? Mas em nosso teste, nós vimos, deixe-me voltar para os testes que deveríamos estar procurando os pedidos de palavras. Então eu posso mudar ponto glassdoor necessidade de mudar meu teste. Então, às vezes o teste erode pode sangrar em um caminho, nem mesmo escrever em um quarto. Ella é velha, talvez não seja necessariamente o corredor que eu quero fazer. E depois refatora à medida que avança. Tudo bem, então se eu voltar a executar este teste, saberei se meus carrapatos verdes estão certos e minhas afirmações são nulas em vigor. Então, enquanto estou aqui, vou refatorar. Então temos processador aqui. Eu teria processador aqui. E para a maioria, se não todos os testes que vamos realizar, todos estarão a bordo de um processador. Então, em vez de fazer uma nova instância do processador cada vez que temos um novo método, certo? E então seriam 10 pontos diferentes para atualizar. O que podemos fazer é montar um construtor, certo? Então eu ia dizer CTR banheira, banheira. E eu vou colocar no processador placar é igual ao nosso novo processador. Então essa linha, eu queria pegá-la. E então é claro que eu preciso de um campo para este ponto de controle e gerar o campo. Lá vamos nós. Então, ao longo de tudo, eu não quero mais difícil fazer este arranjo. Certo? Eu não tenho que organizar processador cada vez, porque agora eu posso fazer o meu laranja uma vez no construtor. E então eu posso usar esse objeto arranjado em todos os outros lugares. Então, onde quer que eu tenha processador, ainda está no processador placar. Então, se eu executar esses testes novamente, veremos que eles ainda estão passando e saberemos que o código parece mais limpo. Então, uma instância servindo muitos mestres. Então isso é mais uma semana e começar a refatorar seus testes para reduzir a repetição na própria fase de teste. 8. Crie serviços de reserva: Tudo bem, pessoal. Então, a próxima tarefa tem tudo configurar algumas coisas, incluindo nosso serviço ou repositório, que vai armazenar todas as nossas operações Gandalf, você sabe, relacionadas a dados. Então em nenhum lugar olhando para mais separação de preocupações porque queremos obstruir o banco de dados tipo coisas da lógica de negócios real, as declarações if sobre se este pedido é ou não OKR e assim por diante, certo? Então, o que vamos fazer neste aqui é configurar o nosso serviço de reserva de sala de olhos. Então eu editei que salvar registro de reserva de quarto, nada e eu adicionei esta tarefa extra. Você pode fazer isso se desejar, e também mover o último ou o criado anteriormente para a pilha concluída. Então vamos entrar no código. E no projeto principal eu vou adicionar uma nova pasta que eu vou chamar serviços, serviços de dados. E nisso nós vamos adicionar um novo, eu só vou dizer classe, mas realmente vai ser uma interface. E eu estou limpando para o serviço de reserva de quarto. E podemos acrescentar isso. Nós mudamos isso para interface pública. E nesta interface vamos ter um método que irá retornar, bem, ele não precisa retornar nada. Sim, é um método de salvamento para que não devolva nada, pelo menos não retiniana. Então é nulo, Salvar, e será tomando parâmetro para a reserva de quarto, certo? Então, a questão é que até agora temos lidado com pedidos e resultados. No entanto, quando estamos salvando, vamos precisar ver como uma versão pronta para banco de dados da solicitação. E isso vai exigir que introduzamos um novo tipo. Então eu só vou colocar em uma nova pasta. Eu não quero chamá-lo de mau nas modelos e amar o domínio. E, em vez de domínio, adicionaremos uma nova classe. Bem, isso é bom. Esse foi o passo um a um, certo? Então eu fui chamar esta reserva de quarto. Certo? E depois é reserva de quarto. Então este é o nosso novo tipo de dados que vamos precisar. Então eu serviço de reserva de quarto e é bom ter um método para ver a reserva de quarto e espera obter algo fora reservas de quarto tipo de dados. Tão bem o caminho até transforma fora os valores dos pedidos de reserva de quarto, o que quer que seja. Então, se você já fez o design do aplicativo, você apreciaria que às vezes você tem que massagear a entrada antes de poder enviá-la para o banco de dados. Então é para isso que estamos preparando nosso código, separando estes nulos, eu preciso desta sala reservando alguns, apenas indo para criar este novo arquivo por si só. Mas, por enquanto, terá os mesmos campos que os pedidos. Tudo bem, então eu vou apenas ir em frente e copiar e colar esses. E você pode ver que extensão na função R-dot que é adicionar incentivá-lo a habilitar recentemente no trabalho, certo, quando eu colá-lo automaticamente adicionado que usando instrução para mim. E ele Whoa, o que eu vou fazer é tirar isso dos serviços de dados e colocar isso na média do projeto. E então eu vou mudar isso para domínio, é claro, e atualizar a referência dentro da interface. Então isso é pelo menos um passo para apenas preparar para o próximo movimento, que é quando estamos escrevendo o teste, teremos a interface pronta para uso. E o que vamos fazer é garantir que estamos guardando nossos pedidos de reserva de mesa. E é nisso que vamos trabalhar no próximo teste. 9. Teste de unidade: salve uma reserva de quartos: Tudo bem, então estamos de volta ao nosso código de teste e o próximo teste que vamos fazer é querer garantir que realmente salvamos o registro, certo? Então eu vou apenas copiar tudo isso e recompensar de acordo. E este teste vai ser chamado deve salvar pedidos de reserva de quarto. Tudo bem, agora dentro disso, o que precisamos fazer é ligar para o nosso processador. Aqueles, é claro, precisamos ligar. E estamos ligando para salas de livros para que você veja o quão mais fácil isso é feito. Sabemos que o processador está lá para você, então você não precisa inicializá-lo novamente. E dentro disso, precisamos do nosso pedido. - Não. Não temos pedidos. Teria de arranjar outro pedido, mas já arranjámos o nosso pedido aqui em cima. Certo. Então o que vou fazer é seguir o exemplo. Vou tirar isso do arranjo para o primeiro teste que fizemos. E eu vou colocá-lo dentro do construtor. E em vez de ter uma variável local, vou transformá-la em um campo. Então nós geramos o campo na solicitação de pontuação. E, em seguida, em qualquer lugar que disse apenas pedidos nós apenas substituir com pedido sublinhado. Este pedido representa os nossos pedidos de testes e um artista pedidos pode ser usado em qualquer lugar que precisamos que ele seja usado desde que a oferta batendo este objeto mais uma vez, colocá-lo no construtor, e então nós podemos apenas reutilizá-lo em todos os artistas. Agora que fiz as pistas mais globais da Irene, podemos pular direto para a direita. Agora antes que possamos fazer quaisquer afirmações aqui, precisamos configurar, copiar nossos testes versão pronta da nossa interface. A razão pela qual fizemos as interfaces para que ele possa ser injetado em qualquer lugar que precisamos. Mas ainda é uma interface que precisa ser configurada porque tem um método. Precisamos ver sob circunstâncias de teste host caso este método funcione. Então é isso que chamamos de zombaria. Então, felizmente, há uma biblioteca muito boa usada para este tipo de coisa. E vamos ver como isso funciona nulo. Então eu vou dizer sublinhado marca de serviço de reserva de quarto é igual a novo Mock capital M ou CK fora de nossa interface, que eu só vou copiar rapidamente isso e colá-lo automaticamente recebendo as declarações usando, isso é tão legal. E, em seguida, feche o aparelho. E então, para a simulação, obviamente não é algo que temos ainda. Será que nós controlar WC instalar pacote, simular, dizer que pode ir em frente e deixar NuGet, encontrar e instalar a versão mais recente. E quando isso é feito, nós automaticamente obter a instrução de uso. E, em seguida, podemos inicializar o nosso campo pelo nome serviço de reserva de quarto simulação ou. Então. Observe que é fora do tipo que queremos, mas também é MC. Então estamos dizendo para me dar um objeto simulado fora do tipo de dados. No entanto, esse objeto ainda está meio vazio. Temos que fazer o que chamamos de armadilha. Então ainda estamos nessa fase de alcance. E agora nós temos que realmente sentar este método para fazer o que nós pensamos que ele deve fazer antes de chegar lá embora. Mais importante para mim é o fato de que precisamos injetar esse serviço em nosso processador. Então, se você não está tão familiarizado com o que injeção ou injeção de dependência é, eu sugiro que você olhe para um dos meus cursos anteriores sobre desenvolvimento de núcleo ASP.NET, onde mostramos o que injeção de dependência realmente é e como isso ajuda. Agora, neste ponto, este é um serviço que o processador realmente vai usar depois que ele terminar sua lógica de negócios em suas verificações, ele vai usar esse serviço para fazer qualquer mudança real precisa acontecer ao receber o solicitações. Então isso significa que ele precisa de um objeto de serviço de reserva. Ainda não foi preparado para isso. Então o que eu vou fazer é pegar essa declaração do processador e eu fui movê-la. Então, depois de termos o Mach, então eu fui dizer isso que ele também deve tomar um parâmetro de nosso objeto simulado. Então, quando dizemos simulação, é literalmente o tipo de qualquer tipo. Mas queremos o tipo concreto real. Temos que ver os objetos simulados. E se você passar o mouse sobre o objeto, você vê que ele realmente está nos dando sobre o serviço de reserva de sala de olhos. O serviço de reserva de quartos é na verdade o MAC fora disso. Então, estamos recebendo o valor físico. Agora a linha vermelha, podemos resolver isso dizendo controller.js e, em seguida, podemos dizer-lhe no parâmetro para o nosso construtor para nós, certo? Então isso é realmente reduzir o dólar e a frente entre o código rapidamente. Eles não vêem, a linha vermelha se foi. Se saltarmos, não conseguiremos esse objeto, voltaremos e renomearemos isso irrefletido em breve. Mas agora eu estou apenas mostrando para você o que estamos preparando porque em tudo podemos injetar o serviço em nosso processador de solicitações e então podemos usar qualquer coisa fora do serviço dentro de qualquer método dentro de nosso processador. Então, de volta ao nosso teste até agora ou nosso alcance nos tem com os pedidos de teste. Em seguida, ele tem uma configuração do repositório Mach, nosso serviço de simulação. E então estamos configurando nosso objeto processador, que leva esse objeto simulado em como seu parâmetro. Conhecendo nosso teste real, preciso deixar a simulação saber como deve se comportar. Eu poderia ter feito isso aqui em cima. Mas isso teria sido global. E apenas um método realmente precisa desse tipo de configuração neste momento pelo menos. Tudo bem, então vamos ver como esse método inteiro vai se parecer. Então ainda temos que fazer algum acordo. E eu vou fazer isso acima do ato. Então inserções ou o ideal, nós, claramente as coisas mudaram. Por isso, vamos pôr em prática o que precisamos. Então eu vou ter o meu objeto de reserva tipo quarto. Lembre-se que acabamos de criar esse no domínio. Então o quarto vai rei é igual a nulo. Então começa vazio. Então vamos ver o nosso objeto simulado. Podemos dizer configuração de ponto MLK. Lá vamos nós. E isso leva uma expressão lambda, eu vou apenas usar q. e então podemos chamar o método que queremos definir. Em outras palavras, quando esse Mach está envolvido, como você quer que certos métodos se comportem? Assista sobre o método2 em uma circunstância de teste, isso é o que traz para a mesa. Então eu fui ver o salvamento porque é isso que estamos prestes a fazer testes, certo? Quando você é chamado, Você é que eu estou configurando para saber que ele deve tomar qualquer assim eu vou ver que é qualquer objeto fora da reserva pedido. Então quarto vai King solicita tipo. Lá vamos nós. Certo, e então feche parênteses. Então isso deve funcionar o que estou vendo nossa linha vermelha. E é porque estou usando o tipo de dados errado. Isto deveria ser um pedido de desculpas de quarto, certo? Então esses vão salvar os objetos de domínio, certo? Portanto, este deve dizer Salvar, é qualquer reserva de quarto. Então está dizendo para me dar qualquer objeto, desde que seja dieta suave, reserva de quarto. Certo. Então, para continuar, eu vou fazer o que você chama de fanfarrão de chamadas. Então, em outras palavras, quando esse método é chamado, o que ele deve fingir fazer? Então o método de retorno de chamada vai dizer R. Ele dá-lhe o tipo de dados que é eu deveria citar unaspas retorno ou processo. Quando isto é chamado. Você pode ler a documentação se precisar. Mas para o dinheiro da chamada, nós só vamos ver reserva e depois uma expressão lambda. Então, é quase como uma função de delegado, na verdade. E então dentro disso, vamos ver que o objeto de reserva de quarto aqui é igual ao objeto de reserva aqui. Talvez eu possa quantificar esses nomes um pouco mais. Alguém para ver. Salvo procurando. Tudo bem, então o Save, o objeto de reserva que começamos como nulo deve saber, obter o valor do que estava sendo passado durante o teste. Certo, ponto e vírgula, ponto e vírgula. E essa é a nossa configuração para a nossa simulação, ou a configuração para o método save em nosso objeto simulado para o nosso serviço. Tudo bem, então parece complicado, mas uma vez que você começa a fazer isso cada vez mais, vai ficar mais fácil e vai fazer mais sentido. Então, depois de termos feito isso, então nós realmente chamamos o processador. E depois de chamarmos o processador, precisamos verificar se o método foi chamado de alguém para dizer ponto simulado. Por favor, verifique isso. E, em seguida, nossa expressão lambda, Salvar ou Salvar método. E estamos verificando se ele tem um, o qualquer objeto de reserva. E depois dois, vamos verificar. Certo? Então verifique isso, salve com ele é qualquer objeto de reserva. E, em seguida, o próximo parâmetro, se você apenas passar o mouse, você vai vê-lo no experimentador seria o número de vezes que ele foi chamado. Então você pode colocar mensagem de falha suficiente, você pode colocar em coisas diferentes. Mas o que queremos verificar é que ele foi chamado 1 vezes 1. Tudo bem? Então, em situações como esta, o que você pode fazer é dizer quando você está chamando um método ou quando você executa esta opção, verifique se certos métodos chave ao longo do caminho foram chamados uma ou duas vezes. Digamos que se você está testando que com esta entrada, este método deve ser chamado duas vezes, ou se ele deve ser chamado três vezes, et cetera. Você pode ver uma vez, você pode ver exatamente uma vez, pelo menos uma vez, certo? A maioria, pelo menos, por assim dizer, certo? Então você pode, É bastante flexível com os tempos que você pode usar. Então, mais uma vez, estamos ao mesmo tempo. Eu não quero saber se foi chamada duas vezes, então eu tenho um erro. Tudo bem, agora, depois disso, verifique, podemos ir em frente com mais afirmações. Então podemos ver afirmar que isso não é nulo. Então salvar ponto de reserva não deve r. deixe-me apenas nulo. Às vezes, é mais fácil apenas a palavra filtro não-analítico que é velho. Portanto, não deve ser nulo. Tudo bem? E todas as afirmações seriam semelhantes a isso. O que fizemos aqui em cima, onde estes devem ser iguais. Então solicita o nome completo do ponto. Então CVE Booking dot nome completo deve ser o mesmo que o nome do fluxo de solicitação. O e-mail deve ser o mesmo que o e-mail de solicitação e a data deve ser a mesma que uma data. Certo, então essas são minhas afirmações. Eu vou executar apenas este teste e clicando com o botão direito do mouse nele. Então, nas sementes do especialista em testes, eles estão nele. Não errado. Nunca foi arruinado, então não sabe se arruinaria. E então eu posso apenas clicar com o botão direito do mouse e dizer Run. E na Rússia e falhou. E se nós apenas dar uma olhada no que você viu, ele diz que a invocação esperada na simulação uma vez comprado foi 0 vezes Salvar. Tudo bem, então está dizendo que esperávamos que isso deveria ser chamado de pelo menos um. Então, sempre que fizemos o ato, mas nunca foi chamado. Tudo bem. Então isso é tudo o MAC verificar funciona. Então não, podemos ir em frente e ler, desculpe, podemos ir em frente e implementar o código para tornar tudo isso chamado à vida. 10. Implemento: salve uma reserva de quartos: Então, de volta ao nosso processador, vamos colocar o que precisamos para que o nosso teste seja acordado. Então vemos que dois de três testes estão passando, certo? E temos que escrever o lembrete do que foi a falha do teste. Então, às vezes, é bom ter isso pronto para que você possa ler a mensagem e, em seguida, olhar para o seu código ao mesmo tempo. Às vezes, você sabe, apenas tê-los ao mesmo tempo pode ajudá-lo a supor o que você precisa modificar. Então, neste ponto, o que eu quero fazer é limpar isso um pouco. Então eu preciso terminar essa injeção, certo? Então Controle pontos a instrução de uso adequado para isso. Lá vamos nós. E eu fui chamar o próprio nome deste objeto nosso serviço de reserva de quarto, ponto de controle, e permitir que ele criasse um campo atribuído. Como, como você sabe, eu prefiro usar o sublinhado para os nomes dos campos. Então vou mudar isso para um fator unário. E então, basicamente, o que precisamos fazer é introduzir o de. Então, primeiro, recebemos os pedidos de reserva. Se for nulo, lançamos a exceção para que saibamos sobre isso. Mas entre o arremesso está a verificação e verificação de que está tudo bem e de volta, precisamos salvar. Então, se estiver tudo bem, precisamos salvar. Então o que eu vou fazer aqui é apenas dizer serviço de reserva de quarto, ponto salvar. E então isso leva um novo quarto reserva objetos. Então, basta dizer nova reserva de quarto. E eu não gosto de ver esses prefixos referem-se a colocar na instrução de uso. Então reserva de quarto. E então este objeto precisa de dados que praticamente são os mesmos dados que estariam presentes nos pedidos de reserva, certo? Então eu estou realmente indo apenas para copiar isso e colá-lo lá. Tudo bem. E lá temos. Lá vamos nós. Então agora temos a nossa reserva de quarto sendo salvo ou salvar método sendo chamado. Obtendo qualquer citação unaspas, qualquer objeto de aparência de sala. E saiba que se eu voltar a executar o meu teste, então eu levantei a pontuação. Tão fácil que não foi. Claramente, muita repetição está acontecendo aqui, certo? Entre esta linha estão essas poucas linhas, essas poucas linhas e as semelhanças entre nosso pedido de reserva e o nosso resultado no domínio real. Há uma oportunidade de limparmos o corredor se aproximando, espalhando todos os pedaços de código. Então vamos começar vendo as semelhanças e ver como podemos condensar, certo? Então temos a reserva de quarto com esses três campos, então temos um pedido e os resultados da web. Mantê-los separados é importante. No entanto, queremos reduzir a repetição entre todos eles. Então, podemos apresentar, eu vou apenas copiar e colar de um dos resultados da reserva de quarto. E o centro de inverno de outono aqui é reserva de quarto. Base. Reserva de quarto bys representará e apenas pontos de controle. Ou melhor, eu preciso renomear este arquivo, desculpe, então apenas renomeie a classe. Lá vamos nós. Então teremos a base de reserva de quartos, que tem todos os objetos, certo? E eu fui encontrar este resumo porque eu não quero que ninguém seja capaz de criar uma instância da sala olhando BCE. Mas vai servir o propósito da herança em todos os outros. Por isso, posso retirar as suas declarações manifestas dos campos que têm em comum, porque agora tudo existe na base. Tudo bem. Então o mesmo para o quarto olhando, Eu posso remover isso e deixá-lo herdar da base de reserva quarto. Agora, se eu fizer uma construção, todo mundo ainda está feliz. Isso é bom. Então esse refator funciona. Tudo bem. E como eu estava dizendo, quando você inicializa a margem de herança, você seria capaz de saltar entre arquivos em implementações de base muito mais fácil, certo, ou muito mais facilmente. Então é isso que essa margem de herança é. Quatro, se funcionar para você, se achar legal, então não há problema. Se não, tudo bem. Agora, quando voltarmos ao nosso processador, temos a oportunidade de fazer a criação desses objetos. Serei mais genérica. Porque você vê aqui nós estamos realmente apenas repetindo código. E ambos estão contando que o arquivo está vindo dos pedidos de reserva. Então eu vou criar um método privado que vai retornar o tipo de dados T. Então, se você já ouviu falar de chá genérico ou reserva de sala de chá, certo? Então, reserva de sala de chá, eu só estou chamando de genérico. Criar. Objeto de reserva de quarto. Ou eu vou apenas dizer criar, sim, quarto. Objeto rei. Estou a ser explícito com o meu nome de método, só isso. E então isso vai deixar que ele saiba que é um genérico, certo? Então nós estamos apenas chamá-lo de objeto de reserva de sala T, criar sala olhando objeto é o nome do método e é parâmetro genérico é o que quer que ele deve estar retornando. Ele vai levar um parâmetro dos pedidos de reserva de quarto. Então eu vou copiar isso, colá-lo lá. E então eu vou desfixar isso para que tenhamos um pouco mais realista para esta atividade. E então eu fui para especificar onde a sala de chá vai Rei objeto é fora tipo de base de reserva quarto. Certo? Então, em outras palavras, eu estou disposto a ser capaz de passar em qualquer são chamados este método e eu tenho que passar em um parâmetro ou deixá-lo saber do ser genérico relativo ao tipo de dados reserva quarto ser tão qualquer coisa herdar de abelhas reserva de quarto pode ser usado como um genérico. Tudo bem? Então, depois de fazer isso ou implementação é basicamente apenas vai dizer retornar um objeto de reserva de sala de chá. E basicamente vai ter os mesmos campos que o nome completo. Garganta, e-mail. Desculpe, eu deveria ter colocado a nova palavra-chave de retorno, nova reserva de sala de chá, ponto e vírgula. E estou recebendo um erro, tipo criar instância 0. Isso não impede o novo, desculpe, que deveria ter sido novo, o fim de tudo. E lá vamos nós. Todas as linhas vermelhas desapareceram. Tudo bem. Então eu acho que eu poderia encurtar alguns dos nomes, certo, para que ele não esticar tão longe na tela multiplets que eu vou fazer é apenas quebrar a linha para que você possa ver todo o código. Então tudo isso é a primeira linha. E então abrimos as chaves, e então fazemos nossa implementação aqui. Tudo bem? Então, o objetivo disso será substituir nossas declarações explícitas aqui é em vez de ver nova reserva de quarto e repetir que eu posso saber, digamos cria quarto olhando objeto. Eu quero algo fora do tipo quarto Will King, que herda da base. E estou passando os pedidos de reserva como parâmetro. Lá vai você. Tudo bem? E então eu posso fazer o mesmo pelos retornos. Então eu posso apenas dizer retorno cria quarto olhando objeto, mas seria fora regra de tempo, os resultados de reserva tipo quarto. E lá vamos nós. Então isso parece muito mais limpo, muito menos repetição entre os dois. E vemos como os genéricos podem nos ajudar a manter nosso código limpo. E apenas fiquei a sugestão do Visual Studio para mim no método estático. Lá vamos nós. Agora, é claro, o momento da verdade são três testes, então eu vou apenas fazer todos os meus testes. E eu estou recebendo carrapatos verdes todo o caminho. Então é isso para implementar esse teste. Fizemos um refator e fizemos o teste novamente. E mais uma vez, vamos continuar a percorrer essas atividades de acordo. 11. Teste de unidade: verifique se o quarto está disponível: Bem, nós somos equipamentos. Oh, legal. Então estamos na próxima atividade e essa é a disponibilidade do quarto antes de tentar fazer a reserva, certo? Então precisamos adicionar alguma lógica para ter certeza de que verificamos e ver se há algum quarto disponível. E, em seguida, se não há quartos disponíveis, então nós não chave roteável. E eu envio o símbolo, certo? Claro, fazer a contabilidade é o mesmo que salvar o volume. Então vamos saltar para os nossos testes. E eu só vou fazer a cópia regular, colar e renomear. E este é não deve salvar pedidos de reserva de quarto se não estiver disponível. Então, dentro deste método, precisamos fazer algumas coisas. Antes de chegarmos a esse método. Na verdade, precisamos criar novos métodos dentro do nosso serviço de reservas. Então deixe-me pular para a interface. Não faz implementações, então desculpe, que foi Controle F 12, você deve ter, você pode usar sobras, pode control-clique. E aqui, eu vou dizer, dê-me um novo método que retorne. Eu vou usar eu inumerável, Eu acho que é um genérico em nossos tipos de coleção. Então me dê uma coleção de quartos. Então eu preciso de um novo objeto chamado quarto. E eu fui chamar isso, ficar disponível ainda quartos disponíveis. Tudo bem. Não, Este método vai ter que tomar o pedido à direita. Então vou dizer que a data e hora o fez. E tudo o que precisamos para criar esses novos objetos. Então, criando um novo arquivo. E, claro, os objetos da sala precisam estar no domínio, certo? Então eu vou movê-lo para cima, mudar o namespace. Não precisamos de nada nesse objeto ainda. Só precisamos saber se está lá. E nossas interfaces felizes fica quartos disponíveis está bem, tudo bem. Agora, dentro do nosso teste com a nossa configuração para a nossa simulação, precisamos que ele saiba que ele deve retornar. Bem, ao configurar o Mach, eu preciso deixar o método de disco disponível saber que ele deve retornar a lista de quartos. Agora, neste ponto, eu vou, ok, eu vou deixar esse passo um para o estágio de refatoração. Mas o que vamos fazer é puxar este tipo de configuração, configuração dentro do teste. O que fizemos em uma data tão posterior. Então, para nulo, deixe-me apenas ir em frente e fazer o mesmo tipo de configuração de um caso IV, você só quer um lembrete, você pode sempre olhar para a configuração anterior onde fizemos a configuração para o nosso cofre. Precisamos de uma lista de quartos. Eu vou criar uma lista de brevidade campo de tipo sala para este tipo de coisa sala. Vá em frente e adicione a declaração de uso, e eu vou ligar para este quarto disponível. Então, se é privado no placar quartos disponíveis, certo? E, em seguida, dentro do nosso construtor, eu vou inicializar salas disponíveis para ser uma nova instância de listas com sala, com pelo menos uma sala nele. Então, novos objetos de sala, pelo menos um. Assim saberemos que não está vazio. Então, na configuração, vamos dizer serviço de reserva de quarto OR, configuração de ponto simulado. E desta vez eu vou estar chamando o método de quartos disponíveis, que vai tomar o pedido dela como seu parâmetro. E observe que nesta situação estou usando um valor exato. Não estou usando o arbitrário. Não é nenhum quarto olhando porque nós literalmente precisamos testar contra os pedidos, necessidades que podemos mudar a qualquer momento. Então configuração ainda quartos disponíveis. E então para este é um valor retornando. Então não é evitar como o salvamento onde nós apenas tivemos que levar a cabo com oxigênio. Então desta vez eu tenho que ver este BreakLine pontos retorna. E então ele vai nos dizer o que é esperado para retornar ou watts delegar que podemos realizar, mas eu só precisava realizar o retorno com as listas de quartos disponíveis. Tivemos IRI e previamente sabendo se contentar com um teste, tendo feito todo esse arranjo antes disso, o que eu vou fazer é quartos claros ou disponíveis porque lembre-se que ele não deve fazer a reserva se houver um indisponível. Então, se os quartos disponíveis são o ponto de referência, então, quando eu estiver executando este teste, eu vou ter certeza de que há aspas, sem quartos disponíveis. Depois vou ligar para o meu processador para reservar a sala com o pedido. Tudo bem? E então eu vou verificar, e eu vou apenas copiar e colar. Little escreveu tudo isso antes, então eu estou apenas verificando que isso nunca é chamado. Tudo bem. Simpático e simples, certo? Então vamos em frente e vemos mais uma vez quartos disponíveis. Sim, temos uma lista de quartos disponíveis. Temos uma lista e tem pelo menos um quarto nela. Então sabemos que podemos testar os quartos disponíveis. Mas nesse caso, queremos dizer que não deve fazer nenhuma reserva se não estiverem disponíveis. Então eu vou simular nenhuma reserva de quartos disponíveis limpando minha lista. E então o processador vai fazer sua chamada regular. E então nós vamos apenas verificar se isso nunca é chamado. Neste ponto. Isso está agindo como uma afirmação. Eu não preciso de nenhuma outra afirmação porque eu não preciso verificar se quaisquer valores voltaram ou os de alguém são os mesmos que qualquer outra coisa. Só vai ver que nunca é chamado. Certo, então vamos testar este novo. E estamos lidos e acho que estamos prontos para ir. Então vamos saltar para a implementação do código para fazer isso acontecer. 12. Implementar: verifique se o quarto está disponível: Tudo bem, então já temos teste, vamos pular e fazer nossas modificações para fazer o artista passar. Então, pulando para o nosso processador de solicitações, a condição é que, se houver salas disponíveis, então podemos ir em frente e ver se não há salas disponíveis, então o método save não deve ser chamado. Alguém para começar conseguindo os quartos disponíveis. Eu vou dizer var quartos disponíveis é igual ao meu ponto serviço de reserva quarto recebe quartos disponíveis para o bit pedido atual. Fazendo isso, posso ver se os quartos disponíveis pontuam cones. Então isso está retornando um inumerável SF para dizer cone aberto e fechado é maior que 0. E isso requer ligação. Lá vamos nós. Então, se os quartos disponíveis pontuam cones, e então aqui está vendo que sugere sobre estes que eu poderia ver adotar qualquer, certo? Então, se houver algum, o que me devolveria um booleano. Se houver algum, então eu posso ver. Então, com isso, se a condição nos introduzir três testes e nosso teste está passando, então se não há nenhum, então isso nunca seria chamado. Tudo bem. Ou se não houver nenhum quarto disponível que nunca seja chamado. Tudo bem. Então vamos fazer duas atividades. - Não. Primeiro, vou discutir brevemente o que mencionei antes sobre provavelmente refatorar ou reorganizar como fazemos nossas configurações. Então, no passado eu trabalhei em projetos onde em vez de configurar em cada método único, para cada método como ele é necessário. O que fizemos foi criar um único arquivo que retornou toda a simulação com todos os dados de amostra, todas as configurações, tudo. Então temos 1 de contato. Se você precisa fazer uma configuração, se você precisa fazer qualquer coisa relacionada ao objeto simulado, temos 1 de contatos e tudo o que é relativo a como você está interagindo com os dados. Claro, porque em nossa situação, antes de tentar rasgar essas coisas construídas, é claro, como quartos. Você pode construir uma pseudo lista de salas em outro lugar, mas as salas disponíveis estão sendo usadas por outros lugares. Então você teria que levar isso em consideração. Também para um anúncio para se contentar com a reserva CFD. Temos aqui o ganho da sílaba, mas estamos a fazer algumas afirmações contra ele. Então, por que eles parecem fáceis o suficiente para apenas rasgar tudo isso OTA e apenas fazer a configuração em seu próprio arquivo. E então nós obteríamos o método save já configurado. Sempre que obtemos um objeto simulado através desse arquivo, temos que considerar algumas das afirmações sobre as dependências, certo? Então, com isso em mente, eu não vou necessariamente ir em frente e fazer qualquer refatoração com os testes. Eu só queria dizer que se você vê a oportunidade de fazer isso, então você pode saber que a segunda coisa que eu queria fazer é mostrar-lhe como você pode depurar. Então, às vezes você pode escrever um teste que você acha que está funcionando ou deve funcionar. E em relação ao código que você escreveu, pelo menos o teste e o código devem funcionar juntos outro e, por algum motivo, o teste está falhando e você não tem certeza do porquê. E provavelmente está dizendo alguma MRSA que não é necessariamente para ver qual é o erro. Então eu cometi um erro ou eu apenas modifico os testes que nós escrevemos e modificamos para que ele possa falhar, certo? Então você não precisa necessariamente fazer essa atividade, pode ver o que estou fazendo. Isso, eles podem entender que isso funciona. Então eu fiz o arquivo de teste, certo? E diz que eles inspecionaram invocação no Mach é uma vez, mas nunca foi chamado. Então, aquele espeto, estou curioso sobre isso. Meu teste diz que deve chamá-lo de 1s, mas baseado no ROTC trimestre recordando-o dado o cenário de teste. Então, é claro que quero saber em que ponto meu código está fazendo algo que você não deve fazer. Às vezes ele pode ser artistas, certo? Então você só tem que ter certeza de verificar os dois lados. Então eu vou escrever o teste em si e, em seguida, dizer Debug. E antes de eu depurar, realmente colocar um ponto de interrupção em algum lugar do método, certo? Então eu deveria ter dito isso antes. Portanto, antes de ativar, você deseja colocar seu ponto de interrupção. Então pontos de interrupção regulares como o que você usaria quando você está regularmente ou rotineiramente construindo algo em seu código, você pode usá-los. E quando você entra no modo de depuração com o teste, ele irá realmente reconhecê-los. Então vai em frente, seu parente para o cenário de teste, certo? Então, se olharmos para solicitações de reserva, você verá que este objeto é exatamente o material de teste que nós zombamos em nossa classe de teste. Se você olhar para os quartos disponíveis, não é nulo. O pedido é que se eu passo, então você vê quartos disponíveis é 0. Por quê? Porque nós os liberamos antes do teste em particular ser executado. Tudo bem. Então eu digo se os quartos disponíveis é qualquer, então ele deve ir e dizer se é 0, se a corrente é 0, então não há nenhum. Salta por cima. E assim nunca porque é, tanto quanto eu estou preocupado, está fazendo o que é suposto fazer. Então, enquanto o ECS, eu continuo e, em seguida, ele salta para a linha nota que o histórico eo erro, vendo a invocação inspecionada é aqueles que foi chamado 0 vezes. E então eu percebi, oh, minha invocação está errada. Eu não deveria estar checando se ele fosse chamado uma vez. Eu deveria estar checando para ser chamado. Nunca. Tudo bem. Bem, eu só estou mostrando como o modo de depuração pode ajudar a 0. É talvez para fora que pontos do seu código ele está fazendo algo onde ele relação ao teste ou em que pontos fora do seu teste, você tem um erro. Tudo bem, então você tem que ter certeza que esses dois funcionam em conjunto para que eu possa parar de depurar depois de fazer essa mudança para o nunca, você já teve isso para que você não tenha que se preocupar com isso. Mas quando voltarmos a executar este teste vai ver que ele não passa. Tudo bem, então é assim que você pode ir em frente e adicionar um pouco de depuração aos seus testes à medida que você avança. 13. Teste e implementação: adicione o ID de quarto para resultado: Tudo bem, pessoal. Então, para esta atividade, não vai ser uma atividade longa é realmente apenas um adendo a algo que já fizemos. E eu acho que podemos fazer testes e implementação e refatoração tudo em uma sessão nesta situação. Certo, então o próximo requisito é que o documento de identificação do quarto reservado esteja presente no registro de reserva do quarto. Então é realmente um adendo para quando sabemos que vemos a sala procurando registro, precisamos ter certeza de que há uma prisão de identificação. Eu estou pulando para a nossa lista de quartos disponíveis e eu vou colocar em campo para o objeto da sala. Não tem que existir. Isso é bom. Mas ID é igual a outro, digamos um para eu só gostaria de testar o método. Então, novamente, este controle dotnet ele obter a propriedade em salto sobre. E você vê que já é um inteiro, inteiro público. Isso é bom. Tudo bem, então agora temos pelo menos essa identificação para o nosso, enquanto que deve jogar, deve ver, lá vamos nós. O que eu vou dizer é que a Booking.com salva. E neste ponto não há nenhum ID de disco na sala olhando também. Então quarto reserva base de reserva quarto, não o resultado pode ser o resultado, mas não a base. Não quero isso na base porque o pedido não tem identificação de quarto. Certo. Então eu só vou dar-lhe uma propriedade, dizer prop top tub. E esta vai ser a identificação do quarto. Tudo bem? Então eu vou dizer reserva guardada, identificação do quarto. Deve ser, e deve ser igual a, nesta situação, o primeiro ID da lista de quartos disponíveis. Então eu só vou dizer que deve ser em um quadrado quartos disponíveis, pontos. Primeiro, eu quero o primeiro objeto em seus pontos de controle usando link primeiro ponto ID. Certo, então uma vez que isso é chamado, então quando estamos verificando todas essas coisas, aquele ID do quarto deve ser o mesmo que o poço foi o primeiro quarto disponível na lista. Agora, vamos fazer os testes. E às vezes é difícil ver são lembrar qual deles ele pode sempre apenas clicar no tique-taque e dizer executá-lo. Tudo bem, então vamos fazer uma construção de projeto, como sempre. E então ele pode assistir as estatísticas e você vê aqui que está falhando. Então foi aquele. Então diz que baseado na massa ou Sean enganado sala de reserva ID deve ser uma bala foi 0. Então, isso é bom. Uma bela baleia inglesa vendo o que está errado ou certo? Deveria ser um, mas foi 0 e tudo bem. Isso é esperado porque ainda não colocamos nada no lugar. Então essa é a modificação do teste. Vamos saltar para o processador, podemos remover esse ponto de interrupção. E então o que nós vamos ver aqui é se há algum quarto disponível, que nós sabemos sobre uma vez que ele está executando o teste, haverá pelo menos um. Então eu gostaria de ver, me pegar o primeiro na lista do nosso quarto é igual a quartos disponíveis. Primeiro, o primeiro da lista. E então eu vou tomar este método chamado para fora porque sim, eu preciso do objeto de reserva de quarto, que está realmente fazendo um trabalho fantástico de tudo isso. Mas no fim do dia, também preciso colocar a nova identificação do quarto, que estaria aqui. Então eu vou dizer para me dar o quarto procurando pedidos por si só. Então var reserva quarto é igual para criar o quarto olhando objetos. E, em seguida, reserva quarto ponto ID quarto é igual ao quarto que temos. Lá vamos nós. E então nós economizamos ou quarto olhando. Tudo bem. Então, com tudo isso, Helen e deixe-me voltar a fazer os testes. E agora temos verde. Tão ocupado, às vezes, os requisitos chegando já perdem alguma coisa. Ele pode ter que fazer um adendo a um teste existente e você colocar tudo em como você precisa. Então isso é realmente tudo para esta atividade. Não há muito para refatorar, nada para refatorar. Nós apenas modificamos o que uma das asserções e modificamos o código para garantir que esta afirmação seja verdadeira. E é isso mesmo. Apenas modificou nossos dados de teste e este requisito não é cumprido. 14. Teste e implementação: Retorne com sucesso ou resultado de reserva com sucesso: Tudo bem, então nossa inscrição está indo bem. Temos verificado todas as nossas tarefas à medida que avançamos. E assim temos algumas camadas. Então, o que vamos trabalhar no não é retornar sucesso inundação de resultados. Tudo bem, então sempre que enviamos um pedido com os resultados que são devolvidos do código, precisamos ver uma flor se foi bem sucedida ou não. Não, pulando para o teste, eu já fiz o stub método. E antes de avançar, vou mostrar o conceito de testes baseados em dados. Então testes orientados por dados nos permitem, na verdade, em vez de zombar e encenar dados dentro do método, podemos realmente colocar em parâmetros e então podemos alimentá-los. Então o primeiro passo para um teste baseado em dados é não usar o livro para usar a teoria. Certo, então essa é a nossa nova anotação. E então temos dados em linha, que então nos leva muitos parâmetros como estaríamos fornecendo para o teste. Então, nesta situação, queremos testar um cenário onde temos uma bandeira de sucesso. E eu poderia estender isso e dizer sucesso ou fracasso inundação. Certo, porque queremos indicar se a reserva foi bem sucedida ou não, e usarei uma enumeração para essa constante. Então eu poderia dizer reserva, sucesso, bandeira. E o tipo não existe aqueles ainda, aqueles fazem isso. E o próximo parâmetro seria, está disponível. Então vamos querer saber se a inundação é esse valor? Quando é esse valor. Então, praticamente esses são os dados que vamos querer são o cenário que queremos posicionar é baseado nesses dois valores. Então, antes de seguir em frente, deixe-me criar isso. Vou criar isso em modelos. Ou você pode criá-lo não domínio, ou você pode criar outra pasta. Acho que vou criar outra pasta e chamaremos isso de enums. Alguns sabem com certeza se eles vão ser. E então eu vou apenas adicionar uma nova classe chamada de bandeira de sucesso para isso. Mas é realmente uma enumeração pública. E esta enumeração vai ter que o que é sucesso e fracasso. Tudo bem? Então, mais uma vez são coisas como o mar. Foi um sucesso de reserva ou foi uma falha de reserva. Tudo bem, então não, eu posso pular para testar e incluir a referência que falta para a enumeração. Certo, então para os dados em linha, posso ver reservas, sucesso, bandeira, fracasso, coma. Então deve ser um fracasso quando isso é falso, certo? Se não há nada disponível, então isso deve ser falso. E então eu posso ver sucesso quando isso é verdade. Então estes estão apresentando cenários de dados, então o teste de antemão. Então, seja qual for o código que escrevermos, irá inferir automaticamente os cenários baseados no que estamos fornecendo aqui. E, claro, os parâmetros fornecidos nos dados inline irão de acordo com os parâmetros todos alinhados para o método. Então, para o teste em si, eu vou apenas escrever código que é um genérico o suficiente para qualquer cenário. Se quiser testar quando isso não estiver disponível, vou querer limpar meus quartos disponíveis, certo? Então estes são os nossos dados de teste. E, claro, se estou testando para quando ele não estiver disponível, então eu quero replicar esta linha. Então vamos ver. Se não estiver disponível. Em seguida, execute esta directiva. Esvaziem os quartos disponíveis. Tudo bem. Então eu vou dizer resultados var, que sabemos que temos de volta quando chamamos o nosso processador. Reserve o pedido. Então eu vou apenas copiar e colar essa linha. Sabemos que ele retorna nossos resultados. Assim, raramente somos testados há situações em que não tivemos que obter os resultados para nossas afirmações e houve situações em que tivemos que obter crédito. Isso é bom. Então, nesta situação, var resultado é igual a chamar o pedido. E então eu vou ver que o, o ponto de inundação de sucesso reserva deve ser e deve ser em qualquer ponto igual ao código. Então r para inundar o dólar incente por resultados. Então flag ainda não existe, então eu vou apenas para Control dot deixá-lo gerar a propriedade dentro dessa classe resultado para nós. E então o que podemos fazer é pular para lá e mudar essa propriedade e ter certeza de que é o que esperamos que seja. E aí está, bandeira de sucesso público. Tudo bem, então isso agora faz parte dos resultados. Posso ver que o teste vai inferir ou afirmar que a qualquer momento, não importa qual seja a situação que está sendo apresentada. Se não estiver disponível, nós limpamos e então tentamos obter o resultado. Portanto, o sucesso da reserva deve ser igual a isso. Tudo o que é fornecido nesta borda deve estar acordo com o que é retornado a partir dos resultados. Então eu vou fazer uma construção rápida só para ter certeza de que tudo está bem. E assim que você puder verificar isso, eu vou executar isso. E o explorador artístico nos permite saber que isso falhou e está tudo bem. Então, se você notar que quando eu deixei cair sobre esta cenoura, está mostrando dois testes aninhados sob o único canhoto método, certo? Mostrando-lhe o primeiro cenário de teste. Então, o primeiro cenário, que é o cenário onde ele deve retornar o sucesso. Então, por padrão, eu não fiz nada, mas o valor de enum está sempre indo padrão para o primeiro diz padrão para o sucesso. Tudo bem? E, em seguida, o cenário de falha não está sendo realizado porque você vê aqui bandeira de sucesso reserva deve ser sucesso. Ambos foram fracassos, certo? Então agora precisamos colocar em código para ter certeza de que tudo isso funciona. Então, no nosso processador, lá vamos nós. Precisamos reforçar isso se afirmação um pouco mais. Então, basicamente, eu teria que deixá-lo saber que o resultado, lembre-se, retorna os resultados. Então vamos construir os resultados manualmente. Não ouço. Bem, então nós apenas adicionamos essa inundação. Então precisamos ser capazes de determinar quando o fluxo deve ser, qual o valor, certo? Então eu vou, em vez de retornar logo ali, eu vou construir o resultado de ou para alguém para dizer que o resultado é igual a. Porque, independentemente do resultado, sabemos que um resultado precisa ter esses valores. Então sabemos que mover esse refator não deve desempenhar um papel importante em fazer o código se comportar de forma diferente. No entanto, no momento em que uma reserva está prestes a ser salva, sabemos que depois de ter sido salva, eu posso ver que a bandeira ponto resultados é igual a reserva, sucesso, sucesso. Tudo bem? Então, se houver algum quarto disponível, fazemos o que fizemos antes e colocamos a bandeira. Caso contrário, vamos dizer-lhe que falhou. Então o sucesso, desculpe, a bandeira vai saber, dizer fracasso. Tudo bem. Chamar esta bandeira de sucesso de reserva é meio enganoso. Então eu vou mudar isso. Então, em vez de reservar com sucesso, vou chamá-lo de sinalizador de resultado de reserva. Isso é mais genérico. Então este controle pontos e deixá-lo atualizar todas as referências em todo o código. E isso parece muito melhor. Então, no final desta operação, vamos apenas retornar o resultado. Então construímos os resultados desde o início e então fizemos nossa lógica de negócios. E então eu coloquei isso depois do salvo porque se este campo então claramente que poderia ter sido um sucesso. Caso contrário, foi um fracasso. E então vamos em frente e retornamos o resultado. Então, se eu executar novamente o teste e eu vou apenas fazer a partir do canhoto médio, então eu estou recebendo carrapatos verdes por todo o lado, certo, agradável e fácil. Então, à medida que colocamos em nossos testes, implementamos, e mais importante é o fato de que podemos fazer teorias ou testes orientados por dados onde fornecemos os cenários. E em vez de escrever declarações para dizer se isso, então, se isso, então, que estatísticas, um monte de coisas podemos escrever um teste que vai caber diferentes cenários que esperamos sair do nosso método. 15. Teste e implementação: Adicione ID de reserva para o resultado: Então estamos de volta para outro exercício e desta vez só queríamos adicionar o ID da reserva do quarto ao resultado. Então até agora temos o ID do quarto sendo adicionado ao resultado, o que significa que sim, eu reservei este quarto. No entanto, não queremos ter o ID do registro que foi reservado. Tudo bem. Isso é bom. Então eu já tenho meus métodos. Não perceba nenhuma anotação porque eu realmente quero que esta seja orientada por dados. Então eu vou ter dois parâmetros. Eu vou dizer um quarto, reserva, idéias, um número inteiro. E baseado em se há algo disponível do que esse valor pode mudar, certo? Então eu vou fazer a mesma coisa aqui onde eu tenho booleano está disponível. Então vou reutilizar a minha teoria. E eu só vou copiar e colar os dois em linhas. O que, obviamente, o login de dados. Então digamos o que nos permite ver o que acontece. Eu esperaria que talvez um ID de um seria , portanto, o ID da reserva do quarto quando é verdade que algo está disponível. No entanto, se nada estiver disponível, como não esperaria nada para o valor de ID? E isso seria falso. Adoro a mudança do meu tipo de dados aqui porque estou vendo nulo, mas isso pode levar um nariz depois de torná-lo anulável, certo? Então eles vão dividir o nosso ponto de interrogação lá que o torna anulável e então está tudo bem. Então, mais uma vez, por causa do meu cenário, se não houver nada disponível, então limpe a sala. Então, para o cenário onde está disponível é falso, em seguida, limpe a lista de salas disponíveis. Caso contrário, eu quero configurar meu método de salvamento. Então eu vou voltar para onde testamos para a peneira. Lá vamos nós. Eu realmente vou pegar isso emprestado. Eu não vou redigitá-lo, apenas aborrecendo toda essa configuração. Tudo bem? E em vez de tudo o que eu fiz lá, eu vou salvar Booking Dot ID. Então eu fui para adicionar este parâmetro ID para a classe de reserva porque obviamente não há ID para ele ainda. E este ID deve ser igual ao que eu estou passando na identificação da reserva do quarto, valor do ponto. Tudo bem. Então eu vou apenas controlar pontos. Deixe-o gerar essa propriedade. E sei que teremos a ideia e a identificação do quarto. Então, se você é meticuloso, você pode querer reorganizar isso e colocar Idea acima do ID do quarto. Tudo bem, mas não fará o código funcionar mais ou menos. É só uma questão de legibilidade, mas tudo bem. Vou deixar como está. Então essa é a configuração para o C quando estamos testando para o cenário, true. Então, se ele não está disponível aqui, os quartos, caso contrário, ir em frente e configurar em. Aguarde que esse ID seja igual ao valor. Então, depois de tudo isso ser feito, eu também preciso fazer representação no resultado para o ID da reserva do quarto. Então eu preciso ter o ID de reserva pública int quarto. Certo. Agora, nosso OCT em afirmar em nosso método de teste será semelhante ao que tínhamos anteriormente onde estamos realizando a chamada para resultado, e então estamos afirmando que o ID da reserva do quarto dos resultados deve ser igual à reserva de quarto que foi passado em. Agora há um problema aqui e é visto que em não contém uma definição para deve ser. Ok, nós sabemos que isso não é verdade, mas eu acho que é apenas um tipo de dados em questão porque este é um int anulável, enquanto este é apenas int. Então deixe-me anular a identificação da reserva do quarto. E lá vamos nós. Tudo bem. Então eu estou fazendo isso anulável porque no caso de algo não estar disponível, então o ID da reserva vai ser ID de reserva de quarto não vai ser de qualquer maneira, certo? Então eu estou apenas tornando anulável que um resultado saiba que ele não necessariamente tem que ter um valor a qualquer momento. Então vamos fazer os testes vermelhos. Então deixe-me correr. Eu não notei dizendo que há dois cenários que ainda não foram executados. Mais uma vez, estes testes são vistos como múltiplos testes dentro de uma sessão. Tudo bem, então vamos pular para o nosso código. Então isso seria no processador de reserva de quarto e PR demais. O que vamos fazer é acrescentar a esta área. Isso resulta em pontos. ID da reserva do quarto obtém o valor de qualquer ID do ponto de reserva do quarto. Tudo bem, então nesse ponto ele recebe esse valor. Então você vê que test.py estava testando o cabeçote de cenário nulo. Deixe-me voltar para os testes. Então ele estava analisando para o cenário nulo onde isso é nulo e que é falso. Então isso realmente teria acontecido naquela noite Charlie, porque aqui não estamos sentando nenhum valor para a identificação da reserva do quarto. É anulável. E assim nulo é automaticamente ser um centro é todos ponto quarto reserva ID nesta situação. Então precisamos ter certeza de que este passe. Então, quando voltarmos e executarmos nossos testes novamente, então veremos que estamos recebendo teste verde. Tudo bem. Então saiba a nossa afirmação de que o ID da reserva do quarto, que é o seu retorno deve ser sempre semelhante ao valor que foi fornecido. Assim, pelo menos um é fornecido, em seguida, o ID da reserva do quarto está voltando como um quando o conhecimento desde que ele está voltando como um todo. Então, isso é bom. Então deixe-me fazer uma compilação e não temos mais nada para fazer nenhuma grande mudança, então não temos nada para refatorar demais. Portanto, é isso para cumprir esses requisitos. 16. Revisão de seção: Certo, pessoal, então podemos marcar com confiança todas as caixas de seleção, encostar todas as nossas cartas que não o fazem. E vemos que para esses requisitos preliminares, implementamos testes e escrevemos código, e temos boa cobertura de código para a funcionalidade principal de nosso aplicativo. Então, tudo isso está feito por enquanto. Então, concluímos testes de unidade para o núcleo do aplicativo. Não, é claro que há muito mais trabalho a fazer. Quando voltarmos, teremos que terminar as implementações de nossos métodos de interface, porque claramente não há nada acontecendo aqui. E, neste momento, ainda está em teoria. Mas o ponto do desenvolvimento orientado por testes é que você pode realmente ter uma boa idéia do design da API, do design geral do aplicativo ou do design de lógica de negócios. Antes de realmente entrar na carne do que realmente precisa acontecer, você pode grampear todas as suas aulas devem olhar e como elas se relacionam umas com as outras desde muito cedo. Então é isso que realmente temos feito. Então, mais tarde, vamos olhar para a conexão com o banco de dados e escrever testes de unidade. Verifique se as operações de banco de dados estão se comportando como esperaríamos e, em seguida, escalar isso para testar o aplicativo completo. Mas, por enquanto, vamos apenas enganar nossas mudanças. E minha mensagem de confirmação é terminada unidade testando núcleo do aplicativo. Podemos cometer tudo e afundar. E quando voltarmos, veremos mais atividades. 17. Projeto de Refactor para camada de acesso de dados: Muito bem, pessoal, bem-vindos de volta. Nesta lição, queremos percorrer as etapas para configurar nossas camadas de acesso a dados. E isso vai envolver alguma refatoração e reorganização de nossos projetos. Se você olhar para o meu explorador de soluções, verá que tenho alguns novos projetos e alguns arquivos estão em novos lugares. E eu vou querer orientá-los passo a passo. Eu não queria fazer isso na câmera porque todos nós sabemos como criar projetos. Então eu vou apenas guiá-los e você pode pausar e replicar enquanto avançamos. Mas desde que você apenas olhe através e faça isso passo a passo, eles não devem ter nenhum grande problema. Então vamos começar com os novos projetos que foram adicionados. Nós adicionamos o domínio Up, então sala bulking up dots domínio, que é seu próprio projeto. Nós também adicionamos quarto reserva até persistência ponto de ambos estes, I apenas bibliotecas de classe. E se você se lembra, a sala olhando para cima sobre o núcleo era apenas uma biblioteca de classe. Assim, as mesmas regras que você usa para governar a sala aumentando o núcleo, você pode reutilizá-las para o domínio e a persistência. E, em seguida, adicionamos outra sala de projeto de teste x unidade aumentando persistência ponto. Certo? Então, você pode ir em frente e adicionar esses três projetos à sua solução. Agora, em termos de reorganização dos arquivos, o que fizemos foi pegar a pasta de domínio ou servidor de arquivos na pasta de domínio e colocá-lo dentro dos projetos de domínio. Então eu me livrei da pasta não antes. Claro, eu peguei os arquivos e colá-los dentro dos projetos de domínio. Então, revestimentos tão fáceis como clicar no arquivo que você quer e você usando Control X entrar no projeto você quer e dizendo Controle V. Então, isso é tudo que eu fiz para cortar e colá-los no projeto de domínio. O próximo grande movimento foi o movimento da base de reservas de quartos, certo? Então lembre-se que nós tivemos a classe base reserva quarto em si, a pasta modelos. Eu tirei isso e coloquei em sua própria pasta na classe de domínio chamada modelos base. Tudo bem? Agora, é claro que isso iria perturbar muito do que temos no lugar porque os namespaces têm que ser alterados e nós temos que colocar em uso adicional. Portanto, as alterações de espaço FirstName ocorreram com os arquivos que foram movidos. Então quarto, reserva de quarto e base de reservas de quarto todos tem novo domínio. Desculpe, nomes de namespace sob a forma de reserva de quarto, domínio de ponto Para reserva de quarto e quarto, e, em seguida, reserva de quarto este quarto reserva de dot domínio modelos baseados em pontos. Então, com essa mudança, na verdade levanta alguns dos erros que teriam sido esperados. Então você tem que primeiro deixar este projeto, nem que ele tem um projeto ou uma referência ao projeto de domínio. Você pode fazer isso de duas maneiras. Ou você vai, eu uso o ponto de controle e você realmente veria esta adição para adicionar a referência principal. Mas se você quiser resolver as coisas em suas próprias mãos, você sempre pode clicar com o botão direito do mouse em dependências, adicionar referência de projeto e, em seguida, apenas certifique-se de que você tome a média. Então, uma vez que a referência do projeto está presente, agora podemos controlar ponto e adicionar as instruções de uso em qualquer lugar que ficou ofendido com a mudança, certo? Então você pode simplesmente analisar cada arquivo meticulosamente e certificar-se de que estamos atualizando as referências em outros. Use a tecla Control para limpar como eu ir junto. E em nosso processador saberia que este seria um arquivo muito chateado, porque é aí que muita da ação ocorreu. Então, basta usar pontos de controle que estão usando instruções. E em qualquer lugar que não esteja satisfeito. Apenas ponto de controle, pontos de controle. E com alguns, deve ser, tudo deve ficar bem. Portanto, apenas certifique-se de que seus namespaces estão corretos e você atualiza todas as referências conforme você avança no teste. Então eu tenho certeza que nós vamos ter alguns que nós precisamos atualizar também. Então controle ponto e atualize as novas referências de namespace. E com um, está tudo bem para mim neste teste. Então essa é a cirurgia com o domínio. Tudo bem, então você pode ir em frente e configurar este presidente de persistência e tudo isso adicionando uma pasta chamada repositórios, que está vazia, certo? Não há vestível para preenchê-lo. Farei isso juntos, mas faremos isso juntos. Mas para o contexto de banco de dados, o que eu fiz foi adicionar uma referência à Microsoft como Entity Framework Core dot SQL Server. Então você pode colocá-lo no projeto para o XML ou, claro, usamos novo recebe você basta clicar com o botão direito do mouse. Vá para Gerenciar pacotes NuGet e você pode procurar e procurar o SQL Server e instalar essa biblioteca. Assim que tiver aquela biblioteca instalada. Quando estamos configurando nosso contexto de banco de dados. E eu ainda tenho algum voto ofensivo aqui, sem problema, Controle pontos e adicione as declarações usando. Naturalmente, os projetos de persistência também precisarão de uma referência ao projeto de domínio. Tudo bem, então mais uma vez, apenas certifique-se que você tem a dependência do projeto. Então, se o Dot não sugeriu que é você que quer fazer para si mesmo, ele pode ir direto para nos pegar o resto do arquivo e ver o que fizemos aqui. Então, um, nós adicionamos a referência ao uso para Entity Framework Core depois que deixamos nossa sala pública olhando para contextos DVI herdar de contextos DVI. Então temos o nosso construtor. E lembre-se que um atalho para construtores, veja banheira de alcatrão, banheira épica falha porque ver TOR coberto lá, embora. Então você sempre pode fazer isso e gerar seu construtor. E dentro desse construtor temos os parâmetros DB, sala de opções de contexto aumentando contextos e opções Didi. E depois temos que passar isso para a base. Tudo bem? Não precisa de nenhum conteúdo. Apenas certifique-se que você tem aquele construtor. Para nossas tabelas ou conjuntos de RDB. O que temos seria DB conjunto de tipo de quarto para os quartos, DB conjuntos de reserva tipo quarto para as reservas de quarto. E então nós temos o nosso protegido mais no vazio sobre modal criação de ModelBuilder, certo? Então, para este método onde religiosos sobrescrevendo um atalho para chegar a acabar com um pouco para apenas mergulhar sobrescrever e, em seguida, espaço. E então ele lhe dá todos os métodos que você poderia sobre ele é evidenciado modelo de serotipagem, então você vai vê-lo aparecer na criação do modelo. Então isso é bom que o método sabe o que estamos fazendo dentro desse método. Stub. Isso tudo desfaz tudo isso. O que estamos fazendo nesse método stub é semear alguns dados, certo? Então eu estou apenas vendo ModelBuilder ponto sala de entidade tem dados e, em seguida, nós estamos apenas adicionando três novas salas. Então verá que tenho identificação e nome. Então, antes deste nome não existia. Tudo o que tínhamos na sala era identificação, então você pode pular para o quarto e adicionar essa propriedade de nome. Sem problema. Depois de adicionar essa propriedade name, então você pode ir em frente e dar-lhe um nome. Você poderia dizer nome, você poderia dizer descrição do que quer que seja. Nós só queremos alguns dados de amostra e você sabe, para torná-lo um pouco mais sensato, adicionar um pouco mais como nosso aplicativo está se unindo. Não, em termos de chaves estrangeiras, definitivamente precisamos adicionar uma referência de chave estrangeira, que na sala e no quarto olhando para dentro da sala vai rei poderia OS. Então, vou reorganizar isso rapidamente. Eu vou dizer ID do quarto, mas eu também vou adicionar a propriedade de navegação do tipo sala e chamá-lo de quarto. E isso serviria para que ele saiba que este é um período chave estrangeira. Então Entity Framework Core é inteligente o suficiente para saber que esta é uma chave estrangeira. Se você quiser saber mais em profundidade coisas, um buraco parafuso Entity Framework Core funciona e como seu banco de dados modelo é chaves estrangeiras sutis e assim por diante. Você pode conferir meu curso, Entity Framework Core, uma turnê completa. Então eu não vou ficar muito em profundidade com as configurações e todas as possibilidades do Entity Framework aqui. Em vez disso, continuaremos sentando em nossas camadas de acesso a dados para que possamos começar com nossos projetos, certo? Então, neste ponto, eu quero colocar no repositório. Então esse repositório, é claro, ou talvez eu deva chamar esses serviços de realmente serviços de dados, certo? E então poderíamos renomear isso para serviços de dados, se você quiser. Quero dizer, há tantas maneiras de ele mudar o nome. Às vezes você nomeia um nome, um nome, e então você se depara com problemas. Isso é o que eu acho que vou chamá-lo de repositórios. Porque realmente e verdadeiramente, mesmo que chamemos de serviços de dados, eles são realmente apenas repositórios para funções. E ele tem, eu vou adicionar um novo arquivo. E eu só estou excluindo o nome lá. Então eu vou adicionar uma nova classe. E eu queria chamar de serviço de reserva de quartos. Só com todo o eu, certo? Vamos acrescentar isso. E fui conhecer uma aula pública e vai herdar do serviço de reserva de quartos. Então isso significa que eu preciso de uma referência de projeto para o núcleo. E eu vou fazer isso e a declaração de uso. E então a próxima coisa importante é que ele precisa implementar a interface. Muito bem, agora temos os nossos métodos de implementação. Claro que temos o método ainda comprado, não a implementação real, certo? Então, mais uma vez, se você quiser ver como essa margem de herança pode ajudá-lo, você verá os marcadores azuis ouvindo à minha esquerda. E se eu clicar, posso pular para o arquivo principal. Então essa é uma maneira rápida de navegar entre arquivos e sua aparência como eles estavam sendo o que eles estão herdando, certo? Então isso é realmente para null para, para configurar as camadas de acesso de dados. Bem, mais uma vez, se você precisar revisá-los, pausar e passar, ver exatamente o que eu estou humor onde e, você sabe, você pode ter pequenas variações de alguns dos nomes que você usou para o seu projeto versus seu pastas. E isso é bom, certo? Desde que a idéia geral de por que sempre dividir isso esteja lá. E é relativo à mudança. É filosófico, na melhor das hipóteses. Mas desde que você entenda onde estamos, o que precisa ir e toda a sua variância e obter as referências em vez de que deve ser bom. Vemo-nos da próxima vez quando lermos o nosso primeiro teste de integração. 18. Teste de unidade: Recupere quartos disponíveis: Bem-vindos de volta, rapazes. Somos um ousado para ler ou primeiro testes de integração ou teste de unidade contra a funcionalidade esperada do Entity Framework. Então, já estamos configurados ou contexto de banco de dados e teríamos configuração ou outros projetos no projeto de teste, criei um arquivo aqui, testes de serviço de reserva de quarto. Então você pode ir em frente e adicionar esse arquivo de classe. Claro, torná-lo público. E então dentro deste arquivo vamos ter o nosso primeiro método. Então é um vazio público, deve retornar quartos disponíveis. Então, é claro que temos que decorá-lo com nossos atributos e em qualquer declaração de uso para que isso aconteça. Agora podemos começar nossos arranjos. Então, se saltarmos de volta para o nosso código para o nosso processador, lembraríamos que para nós conseguirmos os quartos disponíveis, precisávamos passar na data de reserva do pedido, certo? Então, para testarmos contra o banco de dados, temos que simular o que o banco de dados precisa saber se algo está disponível. Então a primeira batida fora do intervalo seria dizer var é igual a sabia o tempo. Podemos colocar em algum tempo de teste, certo? Então eu vou colocar na data de hoje que é 2021, 0 seis vírgula 09. Está bem, e depois vou guardar as nossas opções. Então a coisa é, sem dúvida, porque precisamos de uma instância do nosso banco de dados. Vamos ter que inicializar as opções que podemos passar para o contexto do banco de dados. Então lembre-se que é o nosso contexto tem o construtor que está procurando algumas opções, parâmetro do tipo de opções de contexto de banco de dados e em relação à sala olhando para contextos EV, certo? Então, eu só estou dizendo opções var são, você pode ver opções de banco de dados ou contextos opções sobre você precisa nomear isso. Então eu vou dizer var opções de banco de dados é igual a uma nova instância do novo construtor de opções de contexto de banco de dados em relação aos contextos DVI reserva de sala. E nós temos os parênteses e nós adicionamos ponto, usar banco de dados na memória. Agora, ao longo do caminho vamos ter que adicionar algumas referências enquanto, e você vai ter que somar referência projeto para a persistência, certo? Então, mais uma vez você clica com o botão direito em dependências Vá em frente e adicione persistência. E outro que você vai ter que adicionar é um ao Entity Framework Core na memória, que você pode obter através do NuGet. Então você apenas clicar com o botão direito do mouse em muito dinheiro e você recebe pacotes. Você pode realmente apenas procurá-lo na memória. E você deve encontrá-lo muito facilmente. E ao instalá-lo e eu, você obtém todos os outros e para as bibliotecas Framework Core que são necessárias. Então você pode ir em frente e adicionar essas duas referências. E então você deve se livrar de todas as linhas vermelhas que se encontram aqui em cima. Claro, você tem que se certificar de que você tem a instrução apropriada usando como você ir junto. Então aqui estamos vendo o uso de banco de dados na memória, e este é o banco de dados que eu vou estar usando. Mais uma seria opções de ponto. Certo, então essas são nossas opções de banco de dados que estamos construindo para o banco de dados na memória, que só existirá pelo tempo necessário para realizar o teste. Tudo bem, então tudo bem. Não, dentro do contexto do intervalo, a mesma coisa. Queremos um exemplo de contextos. Então eu queria ver contextos VAR usando o contexto var. Então, isso é basicamente dizer nos cria escopo onde você tem um contexto sendo igual a uma nova instância de nossa reserva de quarto. Contextos de bebê, que se lembram de tomar um parâmetro de opções, eu dou a ele as opções que acabamos de criar, que são opções de banco de dados. Tudo bem? E, em seguida, dentro deste bloco usando, vamos semear com alguns dados temporários apenas para o tempo de vida deste teste. Então eu queria dizer contextos ponto adicionar. E você pode realmente apenas adicionar uma nova entidade de qualquer coisa que ele reconhece, certo? Então, em versões mais antigas do Entity Framework Core, você provavelmente deve ser contextos mais específicos. A mesa que será quartos, pontos ímpares. Mas então, nas versões mais recentes, você pode apenas dizer contextos ponto-ponto, e então você dá a ele um objeto que ele sabe, ele sabe. Então, seu quarto. Tudo bem. Vá em frente e adicione a referência. Então eu estou adicionando uma nova sala e eu posso dar-lhe um id igual a 1. Talvez se você quiser, você pode dar um nome a ele. E depende de quão granular ou quanto detalhe você deseja no teste. Então eu só vou dizer quarto 1 e depois ponto e vírgula. Então eu posso adicionar talvez três desses, certo? Canela deles em conformidade. Então essas são as três amostras que estou adicionando. E então eu vou adicionar aos registros de reservas para nossos quartos. Então por diante para Dan 14 no dia anterior. Tudo bem, então contextos ponto-ponto, nova identificação de reserva de quarto é igual a um. Então esse quarto foi reservado nas datas que preparamos. Tudo bem. E então o quarto ao lado foi reservado no dia anterior ou no dia seguinte, qualquer valor que você quiser fazer. Mas para hoje, apenas um deve ser. Esse é o cenário que estou criando. Claro, é com você. O que você quer fazer no seu cenário de teste, certo? No final de tudo isso, vamos apenas fazer um ponto de contexto salvar alterações para garantir que o banco de dados recebe os dados comprometidos com ele. E você vai notar que eu me livrei do aparelho encaracolado, certo? Então eles editor sugeriu que nós apenas usar pontos de controle e fez a sugestão e mudar isso em uma instrução usando para o contexto. E então podemos ir em frente e escrever todo o nosso código. Então, isso realmente resume para o intervalo do lead contexto DB também tem que organizar um objeto do serviço ou um arquivo repositório para ser chamado de serviço de reserva de quarto do bruxo. Portanto, o serviço de reserva de quartos precisa ser capaz de falar com o banco de dados para ser capaz de realizar o seu funcionamento. Então é por isso que no serviço de reserva de quartos, fomos em frente e injetamos esse contexto. Se não tivermos a certeza de como fazer isso, para conseguirmos o CTO do construtor, a nossa banheira, a banheira. E então nós colocamos na incidência de sala olhando para contextos DVI, contextos e, em seguida, pontos de controle. Atribua o campo e crie. Lá vamos nós. E então use o sublinhado, apenas a chave chamada consistente. E isso é tudo o que há é o injetor. Portanto, não, mesmo que os métodos ainda não estejam implementados, temos uma maneira de falar com o banco de dados através do contexto. Então, em nosso arranjado e tudo, nós temos que inicializar uma instância deste serviço. Deixe-me qualificar o serviço de reserva de quartos. Certo? E o serviço de reserva de quartos é igual a uma nova instância da classe com o mesmo nome, serviço de reserva de quartos, que tira o parâmetro dos contextos, que neste caso são os nossos contextos DVI na memória. Então, agora que terminamos os arranjos, é hora de fazermos isso. Então, para o nosso primeiro ato, teremos var, quartos disponíveis sendo igual ao nosso quarto, serviço de reserva, ponto, obter quartos disponíveis. E vamos passar os dados que preparamos. Então em todos os quartos disponíveis para isso. Simplesmente um não oferecido, é então para as afirmações, o que quer que fôssemos afirmar. Então, neste ponto, se você quiser usar o seu fluido, afirme que suas afirmações fluentes são devem estabelecer nossas afirmações padrão, Isso não é problema. Quero dizer, você vai ver como todos eles funcionam. Então, um, ou pelo menos certamente uma afirmação, a afirmação padrão funciona. Então, neste momento, você pode se sentir livre para usar o que você está mais confortável. O que eu vou usar a afirmação padrão desta vez. Então eu fui para afirmar que o cone da sala, dos quartos disponíveis para isso, deve ser o número X. Quanto dinheiro acha que deveria ser? Então, baseado no cenário que você apresentou, você provavelmente tem uma afirmação diferente de mim. Mas acho que devem ser dois, certo? Porque, e então isso vai sugerir que uma troca os argumentos, certo? Então, para igualar a isso. Então eu estou afirmando que deve ser pelo menos dois porque eu tenho quartos um três e ID do quarto com um é reservado para ele ser ID do quarto 2 é reservado para o dia anterior, e quarto ID3 não tem qualquer reserva de acordo com o banco de dados. Portanto, pelo menos dois quartos devem estar disponíveis. Enquanto as afirmações que podemos fazer seria garantir que os quartos que esperamos estar disponíveis estão contidos na lista, certo. Então você poderia afirmar os cantis. Quais são os nossos quartos disponíveis? E, em seguida, contém não diria me dar o tipo de dados, o que é esperado e, em seguida, me diga o que você espera ver nele? O que essas sobrecargas estão mostrando apenas quatro cordas, certo? Então aqui está, aqui está uma melhor. Então, a terceira sobrecarga realmente mostra para uma coleção inumerável. E, em seguida, leva um predicado R, uma dessas expressões Lambda como o filtro para as comparações. Então, em outras palavras, eu diria lambda expressão Q, que representa qualquer uma das salas disponíveis. Eu poderia dizer que o ID deve ser também, ou pelo menos quartos disponíveis deve conter algo com a ID dois. Certo? Eu poderia fazer o mesmo pelos três. E eu também poderia afirmar que não contém o assegurado de que ele não contém ID com um bem aqui. Número de coisas que você pode fazer neste momento. Se você quiser, sim, desculpe, é um nome que você poderia ter afirmado contra o nome. Então cabe a você, mas isso faz artista agora para ter certeza de que temos quartos disponíveis. E mais uma vez, estamos envolvendo pseudo banco de dados glicose estão criando o banco de dados, organizando-o, sentado em cima com algumas amostras. E então estamos agindo de forma a afirmar. Então vamos fazer este teste. E sabemos por saber que vamos ser lidos. Mas vamos pelo menos executá-lo e ter certeza de que nossa sintaxe está correta. E quando saltamos para explorador artístico, vemos todos os ticks verdes anteriores, mas então vemos que temos um novo projeto de teste e é realmente conhecido pelo nosso novo teste, que está nos dando nosso sistema não implementado exceções. Então, tudo bem. Pelo menos sabemos que está chamando nossos contextos. Desculpe, está chamando nosso serviço, nosso repositório. E está tudo bem nessa frente. Então vamos supor, mais uma vez, andar através de como organizamos, agimos e afirmamos para este teste em particular. Porque apesar de ser um tipo diferente de teste, este é um teste de integração onde estamos envolvendo uma configuração que tem aqueles zombando da nossa encenação. Vamos usar teste laranja onde nenhum sistema de teste, que é um sistema de terceiros porque isso, enquanto o contexto existe em nosso banco de dados, EF Core é uma biblioteca de terceiros. Então nós estamos realmente encenando o que aquela terceira biblioteca de terceiros faria em uma circunstância normal com nosso banco de dados regular realmente sendo conectado. Ainda não temos isso, então podemos fingir usando o da memória, dando-lhe o nome. Então podemos dizer, ok, usar o banco de dados in-memory, chamado isso por enquanto e construir essas opções e no contexto dado a nós por e, é claro, tão versátil que uma vez que construímos opções, temos diferentes extensões . Podemos usar opções SQL, você pode usar opções PostgresSQL. Neste caso, estou usando na memória. E algumas pessoas usariam opções de luz SQL, certo? Então o fato é que você constrói as opções e os contextos do criador. Em relação a essas opções, você rouba os dados que você precisa no banco de dados para esse contexto, para este teste. E então eucariotas, protistas como se você estivesse testando contra dados reais que deveriam existir. Então é como um pequeno passo acima de apenas criar uma lista, certo? Então, esses são os nossos testes vermelhos para esta atividade. Quando voltarmos, implementaremos nosso núcleo. 19. Implementação: Recupere quartos disponíveis: Tudo bem, pessoal. Então nós apenas escrevemos ou lemos testes para nossos quartos disponíveis, chamados de salas disponíveis. E eu já escrevi o código e fiz isso só para passarmos juntos. Mas é por isso que você vê que eu já tenho um carrapato verde. Mas por matriz, eu desfiz as mudanças. Então eu vou correr de novo e fazer um teste vermelho. E lá vamos nós. Então estamos em paridade nula. Vejamos, portanto, como podemos implementar esta citação. Então estamos chamando o método obter quartos disponíveis. Quando eu Controle e F 12 vai pular e você vai ver a exceção não implementada, que é o que isso está reclamando, e tudo bem. Então, nossa expectativa é que quando chamamos esse método, dar-lhe uma data, ele vai retornar regras que estão disponíveis no momento , dados os dados que estão sendo solicitados. Então, o que precisamos para voltar aqui? Precisamos ter certeza de que escrevemos uma consulta que vai ser reflexiva dos dados que é esperado. Então eu posso dizer var, quartos disponíveis é igual ao nosso contexto, pontos quartos. Então eu posso olhar na mesa dos quartos e, em seguida, obviamente precisa de um filtro onde expressão lambda, como eu iria obter o quarto? Então eu tenho duas opções. Eu provavelmente poderia olhar no eu poderia olhar nas reservas de quarto. Austrália, a reserva de quarto estável, onde o DNA é equivalente ao dígito atual. Certo? Mas então como eu sei se eu tenho sorte no quarto reserva estável? Como sei quais tabelas não são? Certo? Então eu acho que eu poderia selecionar o quarto em si. Então, ponto Q, ponto. Sim, nós temos o quarto, então não, eu sei quais quartos estão reservados. Então eu deveria mudar isso para em discos disponíveis. Então, na verdade, estou fazendo isso. Isso é como o meu processo de pensamento habitual ao escrever consulta mais antiga, quais são os, o que é o mais fácil derivar a expressão lambda para obter os dados quer certo? Então eu posso facilmente encontrar os quartos indisponíveis, mas não, eu preciso encontrar os disponíveis. Então eu posso dizer var salas disponíveis é igual às salas de ponto de contexto, pontos onde a expressão Q lambda, Q ID ponto da sala são, em vez disso, eu diria onde em salas disponíveis. Então eles fizeram essa lista. Tudo bem. Então, em quartos disponíveis não há lista. Em segundo lugar, veja onde a lista de quartos disponíveis ponto contém o ID da sala atual é equivalente a false. Na verdade, estou fazendo isso de propósito. Estou mostrando a você o mais complicado onde você provavelmente já descobriu para que você poderia escrever facilmente e se você tem eles elogios para você, não há problema. Só estou mostrando qual seria o processo de pensamento. Alguns Vendo me dão os quartos onde os quartos indisponíveis contêm isso. Então eu realmente escrevi igual a falso por causa da legibilidade, mas também pode não ser contínuo, certo? Mas para fins de legibilidade que interagem ou o equivalente a falso. Tudo bem, e então nós temos isso como uma lista. Então, se eu fizer isso e, em seguida, devolver os quartos disponíveis, então teoricamente eu teria conseguido o que está indisponível, em seguida, telefonado para todos os duros todos os quartos, o que está disponível vendo os quartos. Ele não está contido na lista de indisponíveis, então devolva-o e estamos devolvendo-o. Então eu vou executar este teste e ver se este pedaço de código funciona. E quando olhamos para o nosso teste, vemos que estamos recebendo luz verde. Funciona, certo? Então, como temos feito, provavelmente escrevemos o código de uma maneira que fazemos o teste passar. E então nós dizemos, como eu poderia refatorar este código para torná-lo um pouco melhor ou o que quer que seja, por qualquer motivo. Então, para mim, este é dois banco de dados porque este é um para obter o que não está disponível, então quero verificar se a tabela tem algum off os watts não está disponível. E depois devolvendo o saldo, certo? Tudo isso é realmente porque poderíamos ter definido certas propriedades de navegação dentro dos quartos, estão dentro de nossas aulas para atender isso mais simples. Por isso, as reservas de quartos já têm uma obrigação. Propriedade de quatro quartos. Então foi assim que conseguimos essa chave estrangeira são, isso é o que vamos usar a inferir que há uma relação de chave estrangeira entre a sala e a sala. E isso é bom. Agora, se estamos olhando para ele é no nível do tipo de relacionamento. É realmente um um-para-muitos, o que significa que ganhou quarto vai ter muitas reservas. Então, sim, nós temos a relação de chave estrangeira lá. Mas então na sala eu tenho a oportunidade e eu estou apenas passando por isso no caso de você não estar tão familiarizado com Entity Framework Core, nós temos a oportunidade de realmente dizer ao quarto que ele pode esperar ter uma coleção. E vou usar listas de reservas de quartos. Assim, qualquer quarto pode ter várias reservas. Tudo bem. E quando chamá-lo reservas para representar que é uma coleção. Então, mais uma vez, Entity Framework, nós apenas inferimos que um quarto, muitas reservas e uma reserva para uma regra. Tudo bem. É tudo o que temos agora. Isso é bom. Então, dentro da consulta, eu posso reorganizar as sub-redes. Porque, na minha mente, eu poderia dizer retornar ou deixe-me apenas dizer pegar os quartos disponíveis. Posso dizer var quartos disponíveis é igual ao contexto quartos ponto são. Deixe-me duplicar esta linha. Tudo bem, e tipo de fazer isso do zero para que possamos ver tudo acontecendo. Só estou mostrando todas as opções. Portanto, não é necessariamente que um funcione melhor do que o outro. Quero dizer, se você vai chamar novo custo de ir ao banco de dados mais de uma vez como melhor do que bem. No final do dia, ele está passando no teste. É só que o código poderia ser escrito de uma maneira diferente para fazer um banco de dados chamado assim var salas disponíveis nesta nova declaração. Var quartos disponíveis, sim, é igual a contextos quartos ponto estamos, e então minha expressão lambda aqui teria Q ponto através de reservas. Certo, agora tenho a propriedade de navegação para a reserva do quarto. Então automaticamente Entity Framework diria apenas, eu estou olhando para qualquer quarto, recebe todas as reservas que estão lá que eu posso ver qualquer nesta coleção e amplitude em outras expressões lambda, eu posso ver onde há quaisquer reservas que têm a data de hoje ou a data que está sendo solicitada, por isso foi igual ao bit. Tudo bem, então isso é uma reescrita completa e esta linha sozinha ou lugares, essas duas linhas. Então eu poderia realmente remover isso e, em seguida, apenas retornar quartos disponíveis. E então se você, se você quiser escrever em menos linhas, você pode apenas retornar do começo. Não há necessidade dessa variável. Tudo bem, e eu vou apenas fazer o teste de novo porque eu acabei de fazer um telhado enorme ok, morrer. Condensaram três linhas de código em uma linha de código. E depois vou permitir que os meus testes de unidade me digam se o meu refactor faz sentido e está bem. Tudo bem. Como eu estou recebendo algum feedback, afirmo falha, ele está esperando para um, Ele está vendo apenas um. Olhando para trás, este é o problema que eu deveria ter dito é equivalente a falso, que significa que estou procurando por quartos disponíveis, certo? Então me dê os quartos onde eles têm alguma palavra. Há reservas com a data. E então eu estou vendo quedas não há nenhuma reserva com a escritura, então é mais legível para você. Então me arranje quartos onde não há reservas com as escrituras sendo solicitadas. Então vamos reexecutar esse tecido. Então, mais uma vez, você vê quão rápido eu recebi feedback do nosso refator, fiquei excessivamente zeloso. Anna disse, “Oh, eu posso fazer isso em uma linha. Foi em uma linha, reprovou no teste? Não. Revisei minha única linha de código e estou fazendo um teste verde. Então, mais uma vez, este é um processo de desenvolvimento orientado por testes. Você escreve seu teste, você escreve seu código, você refatora, você testa novamente, e ECL rapidamente. Estamos fazendo todo esse tipo de rolagem através dele. A razão está demorando tanto é porque eu estou tentando explicar enquanto eu vou junto. E provavelmente meus monólogos estão estendendo a quantidade de tempo gasto fazendo isso. Mas eu só quero ter certeza de que você está apreciando o valor de como esses testes estão nos dando feedback em tempo real sobre o desempenho ou a precisão em vez disso, fora do nosso código. 20. Teste e implementação: Salvar uma reserva de quartos: Muito bem, pessoal, bem-vindos de volta. Então estamos entrando e o que vamos fazer é fazer nossos testes de integração para garantir que ele vai realmente salvar os dados para o banco de dados, certo? Tão semelhante ao que fizemos para, ou contextos para o deve retornar quartos disponíveis. Porque o contexto precisa viver dentro da vida útil da operação. Nós não vamos fazer um arranjo global como teríamos feito para o teste anterior, desculpe, para o projeto de teste anterior, onde adicionamos o único arange de qualquer maneira, definimos uma instância para tudo. Então, neste caso, o contexto é meio fugaz e precisa existir dentro do contexto do teste. Então vamos fazer o arranjado de acordo, certo? Uma coisa que podemos manter nossa repetição com certeza seria opções de RDB. Embora. Mais uma vez, você gostaria de mantê-lo único. Então torná-lo único dando-lhe um nome diferente, certo? Então eu vou para Neemias e devo poupar testes. E depois de sentar nas opções de banco de dados, vou criar uma reserva de quarto de amostra necessária. Então, vou dizer que vou reservar um quarto com a identificação desta data. E, claro, há outros campos. Um bom preenchimento no e-mail e no nome completo. Bem, você não colocaria o ID porque estamos prestes a ver se é um não iria fornecer o ID, mas você pode colocar em todos esses campos, mas outros mantê-lo simples e colocar no ID da sala e a data apenas para nossas afirmações. Tudo bem, então agora que temos isso, podemos passar para o outro. Tão semelhante ao que fizemos aqui em cima com nossos contextos DVI. Eu só vou pegar emprestado essa linha e então eu vou iniciar meu serviço de reserva de quarto. Tudo bem. E, em seguida, tendo inicializá-lo, eu posso dizer serviço de reserva quarto pensamento salvar. E eu estou passando em nossa reserva de quarto que estamos economizando direito. Agora, depois de termos fingido salvar ROTC do nem na memória, há uma série de coisas que podemos começar a afirmar. Um. Podemos afirmar que apenas um registro foi para o banco de dados porque a expectativa é que mesmo quando fazemos nossa aplicação, quando chamamos salvar, apenas um registro deve ler o goin. Como no momento eu estou colocando em uma reserva. Nunca deveria ter que gravar. Então, poderíamos realmente apenas recuperar as reservas vendo reservas var é igual ou contextos, Pontos, reservas ou reservas de quartos. Listas de classificação de pontos. Então, estamos pesquisando para obter MC, todas as reservas que estão atualmente no banco de dados. Então podemos dizer var rei, este, o único reserva que deveria estar lá. E posso afirmar solteira. Tudo bem. Então eu estou afirmando que apenas um disco deve estar voltando. Então, se você passar o mouse sobre um único, você verá que ele verifica se uma determinada coleção contém apenas um único elemento do tipo dado. Então vou ver um single vindo das reservas. Certo, então afirme singlet, mas também retorna esse tipo. Então está dizendo um. Deve ter certeza de que só há um lá e eu vou devolver o outro. Então, se ele falhar aqui, então você sabe que ele salvou mais de uma vez e você provavelmente tem um bug em seu código onde ele provavelmente está confirmando mais de uma vez no momento do CVE. Então, depois de termos o fim de semana reserva ou afirmações, certo, Então afirme ponto é igual e podemos começar a comparar o registro armazenado, que neste caso é a reserva com o registro original que teríamos enviado. Então eu posso ver afirmar igualdade quarto booking.com e reserva, que é o que acabamos de recuperar a partir desse ponto coleção ponto. Afirmam que estes dois são iguais. Também afirme que o ID da sala é igual. Tudo bem? E como eu disse, você poderia ter colocado campos de dados para o e-mail e o nome completo, e então você apenas faz suas afirmações de acordo. Bem, é isso que o nosso teste está a fazer no coração do cofre. E, em seguida, com base nas diferentes regras de negócios que você pode ter. Neste ponto, porém, o serviço não deve necessariamente ter quaisquer regras de negócios que deveriam ter sido tomadas fora do núcleo, o significa que ele não deve chegar ao mar de apenas ciclo coloca em todas as validações para garantir que temos que pegar o fogo a menos que cumpra certas condições. Então, todas essas validações realmente devem ir no nível central ou no nível de lógica de negócios. Mas neste nível estamos apenas testando o que o B2B deve fazer. Digamos que você está testando nesse ponto é realmente apenas baseado no cenário do fato de que você está carregando consulta motor. Uma vez que você realizar esta consulta, você está obtendo resultados como o que você esperaria. Não é. Será que a consulta faz isso sob esta circunstância não são? Isso deve ser feito no nível da lógica de negócios. Então vamos fazer nossos testes, que sabemos que vai ser verde, desculpe, vai se livrar ficando à frente de mim mesmo lá. Então ele está construindo um projeto e, em seguida, o Test Explorer vai nos mostrar testes de leitura. Lá vamos nós, porque ainda não foi implementado e tudo bem. Então eu posso apenas clicar, saltar para os testes. E todos esses métodos são realmente precisa fazer é adicionar a reserva de quarto para o contexto e, em seguida, CVE, certo? Então eu fui substituir isso por contextos ou sublinhar contextos, ponto adicionar. E então posso dizer que tinha reserva de quarto. E, em seguida, sublinhar alterações de contexto. E todos devem saber, obviamente, se eu fizer o teste de novo e eu vou correr. Tudo bem, então você vê aqui ele tem cinco testes em torno deste método. Todos estes passados, menos no passado, eram bons testes e este campo. Então eu vou apenas executar todos os testes associados com este método de peneira. E vamos ver o velho comunicador. Tudo bem, então você verá que ele meio pulou sobre o que não precisava reexecutar, selecione este com aquele branco e verde. Não foi executado desta vez porque não foi que testes associados com o CVE. No entanto, todos os cinco testes política Arnold incluindo o que acabamos de escrever. Então isso é realmente para testar se Entity Framework vai ver o registro. Tudo bem, lembre-se que é o que estamos fazendo. Estamos fazendo um buraco de teste de integração. Será que o nosso aplicativo interrompe com o RM ou a biblioteca que está encarregada de falar com o banco de dados. Então é isso que temos unidade testado mais uma vez em diferentes trabalhos torna tão fácil para nós apenas girar um banco de dados para artistas cenário e, em seguida, excluí-lo depois. Portanto, esses bancos de dados só existirão quando esse teste estiver sendo executado. Então isso é realmente tudo para nossos testes de integração. Quando voltarmos, vamos rever tudo para um nível mais alto e seguir adiante. 21. Revisão de seção: Certo, pessoal, então é isso mesmo para esta seção. Adicionamos outro projeto de teste. Então vemos em nossa solução que temos alguns projetos e alguns deles precisam ser testados. Alguns não precisam necessariamente ser testados. Nós não tínhamos este domínio porque é realmente apenas armazenar todos os nossos arquivos de classe que serão posteriormente transformados em entidades para o banco de dados. Nós tínhamos adicionado uma persistência que manterá o repositório ou serviço nosso Serviço de Dados, eu chamo de pasta repositórios, mas eu estou chamando os serviços de arquivos. Então poderíamos chamá-lo assim. Você poderia realizá-lo se você tiver uma convenção de nomes de botões, tudo bem. Mas o conceito é que a implementação do serviço de reserva de sala de olhos. Então i serviço de reserva de quarto terá todos os dados relacionados métodos stubs menos. E então eles serão implementados pelo serviço de reserva de quartos, que definitivamente terá o código concreto. Então, pelo menos quando estávamos na unidade no núcleo, nós estávamos realmente apenas testes de unidade contra o serviço de reserva de sala de olhos. Nossas afirmações em que eu acho que a raposa que o método de teria recebido uma chamada pelo menos uma vez ou nunca baseado na circunstância. Então, por exemplo, nos pedidos de reserva da sala de salvamento, quem veria aqui que estávamos verificando que o método de salvamento foi chamado pelo menos uma vez, certo? Assim, quando fornecido com os dados atuais, base na lógica de negócios que teríamos colocado no processador, esse método de serviço deve ser chamado pelo menos uma vez. Agora, mais uma vez, o núcleo é onde implementamos e testamos a lógica de negócios, as regras por trás quando ele faz certas chamadas de método em que circunstância ele se comporta em uma semana específica, tudo bem. No entanto, o túnel de testes de integração fica sob a lógica de negócios onde estamos integrando ou onde estamos testando os sistemas que estamos integrando com essa situação. Estamos integrando com nosso banco de dados através de uma biblioteca chamada Entity Framework Core. Então estamos testando para ter certeza de que quando chamamos os métodos que estão realmente fazendo o trabalho interdependente ou trabalho que em núcleo de trabalho diferente está se comportando da maneira que gostaríamos que ele se comportasse. Certo, então é isso que é um teste de integração. E neste nível você, é aqui que você começaria a testar como você interage com um QR Rabbit, MQ, certo? Ou chefe de serviço. Você avaliaria para interagir com um serviço de e-mail, qualquer coisa que seja um terceiro. Agora você não é o único certo nas declarações do Leste sobre o código diretamente para você está apenas escrevendo código para interagir com ele, então é aí que você começa a fazer seus testes de integração para testar como eu interagir com ele. Após a interação, obtive um resultado que eu esperava? Então, com tudo isso feito, vamos ao nosso Git e um check in. Claro, vamos escrever uma mensagem que é indicativa do trabalho que foi feito. E então eu vou em frente e cometer tudo e afundar. Uma vez feito isso, podemos fazer uma pausa aqui e então passamos para a próxima seção. 22. Entendendo o teste de unidades . Aplicativos NET Core: Muito bem, pessoal, bem-vindos de volta. Nesta lição, vamos estar configurando nosso projeto web e vamos entender por que é importante testar unidade os projetos web reais. Agora, para esta parte, eu queria estar usando uma API web para nenhuma razão particular vai resolver o fato de que é um pouco mais fácil de ver como nós teste unidade. Não temos a sobrecarga de uma interface de usuário ou algo assim. Com API, podemos usar unidade testar os endpoints com bastante facilidade. Mas isso sendo dito, os conceitos de teste de unidade, um dotnet Core API seria muito semelhante para Razor páginas para cima ou um aplicativo MVC. As únicas diferenças reais seriam os tipos de retorno porque dotnet Core é tão versátil que as complexidades entre os diferentes modelos são muito, muito minúsculas. Tudo bem, então isso é, a consistência é muito boa. Então vamos em frente e criar nossos projetos de API. Eu só vou adicionar um novo projeto. E vamos escolher as principais APIs da Web. Se você não tem isso à esquerda, você sempre pode procurar por Core Web API são apenas essa API. Mas uma vez que você encontrar o modelo, o que nós vamos nomear este é o quarto aumentando a API. Se você quiser usar páginas Ariza não são aplicativo MVC, você iria nomeá-lo wi, outra coisa, mas não são páginas NVC R-dot, o que quer que seja, você quer nomeá-lo. Mas como eu disse, vou demonstrar o uso da API para a sobrecarga mais baixa em geral. Então podemos ir em frente e bater Next. E podemos deixar tudo como está. E ele cria de forma semelhante ao que tínhamos feito com os outros projetos de testes. Nós estamos indo apenas para ir em frente e adicionar um novo projeto, que será um projeto de teste x unidade. Será um quarto reservando muito, testes de ponto api. E então podemos usar isso e criar também. Neste ponto eu vou apenas ir em frente e Bridgette dependências. Então, em primeiro lugar, para o teste foi , bem, deixe-me começar com a API. Então, para a API, ele definitivamente vai ter uma dependência Bridget na camada de persistência e na camada de núcleo. Então você pode ir em frente e adicionar esses. Agora, não estamos dispostos a ir muito mais longe do que isso por enquanto. Em vez disso, vamos apenas olhar para os conceitos de por que nós testaríamos unidade neste nível. Assim, testes de unidade é tudo sobre encontrar auto bits e peças de sua aplicação irá operar em determinadas circunstâncias. Então, quanto mais cobertura você tiver, melhor nesta situação, nós já temos cobertura para o nosso núcleo Up. Assim, qualquer outro processador ou qualquer outra classe lógica de negócios ou operações que adicionamos, podemos testar unidades nesse nível. Os testes de persistência são para o nosso teste, manter as operações de banco de dados conosco, e certificando-se de que eles fazem o que eles devem saber quando você adiciona um, ele só é adicionado, etc. Agora, no nível do aplicativo, é mais sobre ver como o aplicativo responderá em determinadas circunstâncias. Assim, com qualquer aplicativo web, quando você recebe uma entrada válida, você espera que AS ou uma ação seja tomada se você receber entrada inválida aqui esperando que certas ações sejam tomadas, certas coisas podem ser controladas a partir do não necessariamente a interface do usuário ou as apresentações do código por trás ou a pequena lógica em execução em segundo plano. Então algo como codificação contra lógica inválida, entrada inválida, desculpe, então o usuário insere os valores errados. Você tem validação que deve ver se ele é inválido, em seguida, retornado para pj são retornados alguma forma de resultado no caso de uma API. E se for válido, então ganância direta para outra página ou retornar um certo tipo de resultados. Então essas são as coisas que você gostaria de testar unidade para todo este nível de aplicação. Então, se olharmos para o projeto de amostra para a API, vemos que temos controlador de previsão do tempo que tem um endpoint retornando alguns resultados do tipo previsão do tempo. Saiba que vou mostrar-lhe exatamente como seria um teste de unidade para esse endpoint API ou para o controlador em geral. Então, usando o teste de unidade uma classe que normalmente excluímos, vamos apenas escrever esse tipo de testes. Em primeiro lugar, precisamos de nossa dependência do projeto, que está sendo adicionado para o projeto API para os projetos de testes API. Então vá em frente e faça isso. E enquanto estamos lá, basta ir em frente e saltar para NuGet e nós vamos ter que adicionar a ferramenta simulada, a biblioteca de bloqueio também precisará adicionar com certeza. Então você vê em Olá trabalha astuciosamente, você vê em todo o assert negativo dois x projetos de unidade de trabalho. Você pode fazer suas próprias inferências sobre qual você prefere. Isso não é problema. Mas eu vou estar usando certamente para este conjunto de testes. Então instalar, simular e instalar e, em seguida, saltar para a nossa unidade testa um arquivo padrão que eu vim com o nosso projeto, eu não excluí. Podemos usar isso apenas como um exemplo para ver como este controlador de previsões meteorológicas obteria unidade testada. Então, em nosso teste de unidade em arquivo, vamos apenas escrever um testador que é um dever. Retornar os resultados da previsão. Tudo bem? Não, No meu uso de instruções que eu tenho usando não deve estar usando x unidade e usando System.in. Concedido, à medida que escrevemos, você os verá. Você tem a chance de colocar no que está faltando. Então você não precisa necessariamente replicar isso agora. Mas à medida que avançamos, você vê o que precisa acontecer. Então, em primeiro lugar, precisamos zombar do registrador que está presente dentro do controlador de previsão do tempo porque temos este registrador sendo injetado. Então, para acessar o madeireiro, precisamos de um objeto disso. E sabendo tudo isso, zombamos dessas coisas à medida que avançamos. Tudo bem, Então eu vou ter que dizer var logger Mach é igual a uma nova simulação de cerveja em relação ao controlador de previsões meteorológicas. Claro, quaisquer tipos em falta que você vai precisar do uso declaração simulada de topo uma vez que você digita isso. E então eu logger é provavelmente vai precisar estão usando declaração. E, em seguida, é claro, controlador de previsão do tempo vai precisar que usando declaração também. Então vá em frente e controle pontos e inclua todas as referências que faltam. Próxima parada precisamos inicializar ou controladores. Então eu só vou dizer var controlador é igual a uma nova instância do controlador de previsões meteorológicas, que está tomando objeto mock logger como seu parâmetro, muito como você veria aqui. Estamos instanciando uma nova instância do controlador de previsão do tempo e dando-lhe aquele objeto logger. Então, agora que fizemos tudo isso, precisamos atender ao Chamado. Ele só tem um método que estamos testando nossa justiça, que obtemos um resultado. Então, só precisamos ligar para o “get”. Então, para chamar o getter, eu vou dizer var resultado é igual a ponto controlador recebe. Em seguida, podemos fazer nossas afirmações sobre o fica assim ou sobre os resultados em vez. Então eu posso afirmar que pode ser resultado deve ser maior do que um. Você provavelmente também poderia afirmar que os resultados não devem ser nulos. Concedido que estes dois andam de mãos dadas. Se não for nulo, se a contagem for maior que um, então evidentemente não é nula. Mas é possível que isso não seja nulo, mas os cones não está enraizado em um, certo? Então, você sabe, você coloca em todas as afirmações, vemos que colocamos em todas as afirmações que queremos ter certeza de que nosso método está fazendo o que esperamos que ele faça. Então eu estou testando após o fato nesta situação. Então este é o lugar onde essa divisão tipo de vem com testes de unidade porque às vezes unidade de teste é, é introduzido após o fato. E então, nesse ponto, não está claro o que exatamente eu deveria estar afirmando em relação ao código que já está escrito, certo? Versus quando você escreve o teste primeiro, e então você escreve a citação demais o teste, então você sabe exatamente como para o que precisa acontecer. De qualquer forma, vamos tentar fazer este teste e ver se conseguimos bons resultados. E depois de realizar esse teste, vejo que temos testes concordantes. Então temos um teste verde, é claro, porque ele já existe, são o código já existe em vez. Então, se eu fiz algo como return null, digamos que quer refatorar sabe, e para, você sabe, eu inadvertidamente introduziu este retorno null em algum lugar neste método que vai distorcer completamente o que deveria retornar, então nosso teste deve saber que está falhando. E lá vamos nós. Então agora estamos vendo que eles estavam recebendo outra exceção. E essa exceção tem mais a ver com nossa afirmação de que com o próprio código, Fred, está recebendo essa exceção de conhecimento porque eu retornei nulo. E isso é nulo. Então você não pode encontrar os cones fora nulos. Você pode encontrar o número de nada, certo? Então deixe-me reorganizar esta afirmação e tentar novamente, devemos ver um tipo diferente de era, menos erro de exceção desconhecido. E lá vamos nós. Então, em nenhum lugar recebendo uma mensagem dizendo que o resultado não deve ser nulo, comprado estava tudo bem. Então essa é a nossa afirmação. Saiba que estou vendo que não deve ser nulo. Então está parando antes mesmo de chegar a este para sentir que está nos deixando saber que campos de afirmação. Então, esse é um exemplo básico de como nós controladores de teste unidade ou por r, por extensão, o projeto web no ASP.net Core. Então, quando voltarmos, estaremos implementando nosso próprio controlador e unidade de teste ou controlador próprio com os testes de unidade mais significativos ou de contato contextualmente apropriados. 23. Configure o Sqlite em loja de dados em memória: Ei pessoal, bem-vindos de volta. Antes de irmos mais longe com nosso teste de nosso aplicativo web, eu quero que nós configurar o Datastore e eu vou dar-lhe que esta é apenas uma obrigação de exemplo rápido e eu não vou tão longe como configurar um banco de dados SQL Server inteiro para apenas um ou duas mesas, vamos manter seu bebê. Vamos usar uma conexão SQL lite na memória. Tudo bem, então no arquivo CSS do ponto de inicialização, vamos pular para lá. E abaixo da implementação swagger, podemos começar dizendo string de conexão var, eu só vou chamar meu Khan. String é igual a fonte de dados é igual a dois-pontos, dois pontos de memória. Tudo bem, agora se você quiser mais informações sobre isso, você sempre pode olhar para como se conectar a bancos de dados SQL light in-memory em um aplicativo dotnet Core, há documentação sobre ele, mas eu não vou entrar em muitos Detalhes, certo? Nulo. Em vez disso, vou continuar com uma cadeia de conexão. Então eu vou dizer var con, con. Nossa conexão é igual ao novo SQL I t0. Então conexão OCC SQL ITE. E então passamos essa cadeia de conexão. Então, é claro que agora sabemos que sempre que vemos esses sublinhados vermelhos, nós controlamos isso. E então você vê aqui eu preciso de um pacote para Microsoft dot SQL I dot core. Então eu vou em frente e encontrar e instalar a versão mais recente. E quando isso for feito, podemos continuar vendo pontos cónicos do Sean abertos. Para que, nesse ponto, vamos abrir a conexão com o banco de dados SQL na memória. Então temos que deixar os serviços e tudo o que precisamos para adicionar um contextos DVI. E nosso contexto de banco de dados será o que a configuração na camada de persistência, que é o contexto de reserva do nosso quarto, certo? Então é relativo a esses pontos de controle ou eu não preciso de ponto de controle porque nós temos sobre isso. Eu usaria declarações na pasta. Então, quando eu copiei e colado, você vê que adicionou automaticamente a instrução de uso para a persistência. Então eu encorajo você a usar esse recurso muito. Então eu posso dar algumas opções. Onde eu vou ver sua opção é usar SQL. Isso, que eu suspeito que vai precisar de algum tipo de biblioteca. Mas até lá vou passar os pontos de controle do objeto de conexão. E isso não está me ajudando. Mas eu só não tiro para NuGet com este aqui. Então eu estou indo para ir para New get para o projeto web. E acredito que vou precisar do Entity Framework Core com o SQL IT. Tudo bem, Então, na idéia SQL e tem um monte de outros resultados, é realmente fácil de digitar no Entity Framework Core, e então você verá dois diferentes pontos de núcleo de trabalho SQL ITE dizer pode ir em frente e baixar e instalar esse pacote. E, em seguida, voltando para o nosso arquivo de inicialização, se eu fizer Controle de lote, você verá as opções de instrução usando aparecer e, em seguida, estamos limpos. Então é assim que os contextos RDB para a nossa aplicação web vai se parecer. Claro, em uma configuração real, você teria uma conexão de banco de dados real que provavelmente viverá no aplicativo settings.js em. E então você injetaria isso. Se você quer saber como isso acontece, você pode usar um dos meus outros cursos centrais dotnet onde nós realmente usamos bancos de dados reais. Mas só para este cenário em que estamos apenas olhando para TDD dentro deste contexto. Eu não vou contratado, eu vou apenas acertar com a implementação na memória. Então saiba que isso está feito. Quando voltarmos, podemos começar a configurar nosso controlador e realmente ficar escondido para alguns testes de unidade. 24. Crie cenários de teste de unidade: Muito bem, pessoal, então vamos começar a escrever todos os testes de unidade para o controlador API. Então nós temos apenas um controle, como você pode ver, nós estamos apenas fazendo uma prova de conceito com um muito pequeno up, mas nós estamos olhando para testes unitários e os diferentes níveis. Então esta API vai ser bem simples. Ele só vai ter sob a API que precisamos ser vinculados à medida que eles se movem para o centro. E, em seguida, vamos permitir que o usuário reservar uma sala, quer retornar uma chave de resultados antigos com objeto de resultado como um tudo quando você chegar a um objeto de resultado. E queremos adicionar validação e rejeitar solicitações incorretas. No nosso código, há poucas coisas que precisamos fazer. Um, crie este novo controlador para reserva de quartos. Então eu chamei isso de controle de reserva de quarto. Se você não estiver tão familiarizado com APIs, você sempre pode tirar meus cursos de API. Mas se você precisa saber como adicionar este controlador aqui e não, você clicar com o botão direito do mouse na pasta controller glúteo controller, e, em seguida, aperte API e criar esse controlador vazio com o mesmo nome. Então, isso lhe dará esses modelos básicos. No mesmo fôlego. Você também pode ir em frente e bater novo, criar um novo arquivo de teste controlador de reserva quarto em nossa API para espalhar ou não quando mostrar que ainda porque eu tenho alguma coordenada. Bem, vamos passar por isso juntos para que eles possam criar esse arquivo. Enquanto isso, o que eu vou fazer, no entanto, é ir para os nossos principais projetos e trazer o nosso Serviço de Dados, ou desculpe, não o Serviço de Dados ou processador. Lá vamos nós. Assim, da mesma forma que tivemos o nosso serviço de reserva de sala de olhos e , em seguida, que os serviços de reserva de quartos de olhos realmente apenas Nikon obstrui, em cima de nossa camada de acesso de dados. E então temos a implementação aqui. Na verdade, precisamos que nosso processador seja injetável. Então agora é apenas o concreto, uma classe que você cria uma vez em um lugar e se move ao longo do que então você vê é todo o caminho aqui no núcleo e nós precisamos, é todo o caminho aqui em cima na API. Então o que eu vou fazer é clicar no ponto de controle de pressão de vapor classe. E então você vê que você tem um número de opções. Único, que inclui Extract Interface. Então, quando você cria a interface antes disso, a classe herdada precisa implementar essa interface. Neste caso, já criamos a classe, então não, precisamos da interface. Vou apertar Extract Interface. Sim, eu queria saber um novo arquivo e você vê que ele vai automaticamente dar aquele arquivo que eu estimulo a convenção de nomeação. E ele vai, você pode selecionar e desmarcar o método que você deseja lá, você clicar em OK. E agora temos a nossa interface que implementa o processador de pedidos de reserva. Agora isso precisa ser acessado pela APA. Então, para torná-lo acessível e injetável, temos que vir para a nossa startup. E eu vou apenas remar, eu posso fazer isso sob o contexto do banco de dados. Eu vou dizer serviços ponto, e nós podemos adicionar escopo. Eu mais uma vez, se você não está familiarizado com injeção de dependência, rir um dos meus cursos de núcleo dotnet, o que eu estou adicionando escopo e eu vou adicionar o processador de solicitações de reserva de olhos ao lado sua implementação para que ele pode ser injetado e usado por qualquer um dos controladores em nossa API. Então é tudo o que precisa, certo? Então vamos pular para o arquivo de teste. Então, como eu disse, escrevi uma quantidade de código, mas eu vou guiá-lo através linha por linha. Sinta-se livre para pausar, replicar. Mas estarei explicando tudo para você. Acho que são apenas um pouco as coisas para fazermos então para você me ver digitar. Então eu apenas preparei e então eu vou te guiar por isso independentemente. Então eu tenho todos os ativos ou pelo menos alguns dos ativos, como eu sei, é meio que preparado no topo. Então eu tenho meu construtor onde eu estou inicializando um serviço de reserva de quarto para ser uma nova instância do processador de solicitações de reserva. Eu tenho uma instância do meu controlador. E lembre-se que você pode realmente apenas digitar sobre esta terra e, em seguida, usar ponto de controle para gerar retroativamente este método que estávamos fazendo isso, desculpe, este campo. Já fizemos isso algumas vezes antes disso. Então, para o controlador, você vê aqui que eu estou inicializando meu controlador de reserva de quarto e ele tem uma linha vermelha porque eu também estou dando o serviço de reserva de quarto. Objeto de pensamento. E isso provavelmente me deixa ligar para este processador de reserva de quarto em vez de serviço, certo? Só para ser explícito e claro com os nomes, processador de reserva de quartos e refatoração ao longo do caminho. Tudo bem. Então, o objeto simulado processador de reserva quarto está sendo passado para o quarto olhando controlador. Então, a partir daqui eu posso fazer pontos de controle e deixá-lo gerar aquele jumbo construtor lá. E então eu só vou renomear esses processos de solicitação de reserva de quarto ou processador de reserva de quarto. Com o sublinhado e um sem. Então saiba que o nosso controlador tem a instância do processador de pedidos de reserva de quarto sendo injetado e pronto para você. Isso é bom. Caso contrário, eu tenho uma instância de nosso pedido e uma instância fora de nossos resultados. Agora, mais uma coisa que eu vou fazer, e nós podemos fazer isso juntos é montar esse Mach, certo? Então lembre-se de que esta simulação precisa saber que, quando é chamado, o que deve fazer. Tudo bem, então vamos fazer a configuração. Vamos definir o ponto X. E só há uma sala de livros de métodos. Precisaria de uma biblioteca simulada, é claro. E eu vou estar usando deve viver para minhas afirmações, se esforça para apenas no caso de eu não mencionar aqueles anteriormente, certifique-se de que eles vão para NuGet e você instalar esses dois pacotes. Já fizemos isso antes. E se você não tem tanta certeza, você sempre pode ir para o projeto de teste anterior. Você pode literalmente copiar essas duas linhas. Vá para o seu projeto notado e cole-os lá dentro. E, em seguida, basta fazer uma compilação e ele irá instalar automaticamente esses pacotes para você. Então vamos montar nossa sala de livros. Então, a nossa sala de livros ou requer alguma forma de objeto pedido. Então eu vou dar nossos pedidos aqui. E então ele precisa retornar alguma forma de resultados. Então eu só vou dizer que os pontos retornos são na verdade um tipo que está em seu próprio lugar que deveria estar fora pontos retorna. Lá vamos nós. E o que ele retornará é alguma forma de resultados. Tudo bem, então eu estou deixando estes também. Eles são instanciados, mas eles não têm nenhum dado útil neles ainda. Isso é bom. Mas essa é a nossa configuração para o nosso processador de aparência de quarto. Agora, se descermos um pouco, você verá que eu tenho um teste multiuso aqui. E este teste vai cobrir os cenários de ferramentas de nossa exigência. O requisito é que precisamos permitir que o usuário reserve um quarto. Eu fui, é inválido. Rejeitamos a tentativa. Tudo bem? Então eu tenho uma teoria e tenho dois bits de dados, duas linhas de dados para se encaixar. Então o primeiro é ver que este é o número esperado de chamadas de método, que é um. Quando o modelo IS válido é verdadeiro e ele deve retornar o tipo de resultados do objeto chave antigo. Então o problema é que há tipo de resultado axônio esperado tipo. Então, com APIs, você pode retornar, ok, pode retornar 404 ou pedido ruim, etc. Então, queremos ter certeza de que quando tudo estiver bem, recebemos pelo menos uma chamada de método para a sala do livro e seremos capazes de descartar que Kirk está ligado rapidamente. Desculpe. Então, recebemos uma chamada de método para a nossa sala de livros. E quando ele é válido, e nós obtemos que, ok, objetos resultados quando ele não é válido, nós não queremos quaisquer chamadas de método e deve ser um pedido ruim. Então, aqueles vão em linha com três parâmetros e o nome das estatísticas deve chamar método de reserva quando válido. Tudo bem, eu acho que isso é simples o suficiente. Agora, para o arranjo, vou forçar o estado modelo do controlador a ser o que quer que fosse Boston. Bem, eles são verdadeiros ou falsos, certo? Esse é um modelo válido. Então, se ele não é válido, que significa que passamos em quedas, em seguida, proceder para adicionar manualmente erro de estado modelo. Então nós vamos, eu fui ver nossos pesos, o controlador. Por isso, reparem que estou a usar um peso. Não estávamos usando métodos assíncronos antes disso. E isso foi uma espécie de outra forma deliberada de contornar isso. Mas não, vamos ver como podemos fazer testes assíncronos. Não há problema com isso. Então tarefa assíncrona, que é a assinatura para o método de teste. E então aqui estamos aguardando nosso controle ou chamando este método chamado sala de livros, recebendo um objeto de solicitação. Então o que eu vou fazer aqui é usar ponto de controle e gerar esse método. Ir para lá e eu vou torná-lo um AsyncTask que retorna resultados de ação I. Tudo bem, só para ter certeza que ele sabe que ele deve estar retornando algo que é de um tipo de mensagem de resposta HTTP, geralmente falando. Tudo bem, então com isso feito, nós nos livramos desse erro. Temos essa mini-implementação. Em seguida, podemos afirmar que o resultado deve ser do tipo, tipo de resultado de leilão esperado. Tudo bem, então seja qual for o tipo, então eu sou Boston com qualquer um dos cenários. Estamos afirmando que esse deveria ser o nosso tipo. Eu também vou ver que o nosso processador de reserva de quarto. Então eu fiz um pouco de renomeação desde que começamos esta Lição. Quarto olhando ponto processador verificar que a sala do livro com o pedido é chamado exatamente esse número de vezes, que está sendo passado através de nossos dados em linha. Nulo. Você pode apenas fazer uma construção. E então, uma vez que o acúmulo foi bem-sucedido, você pula para o Explorador de Testes. E então você verá seus testes de API. E eu vou apenas executar os testes de API. E nós deveríamos estar vendo ou todos os testes são de propriedade, ou pelo menos para o que acabamos de escrever. Bom. Então temos que ler testes porque ambos estão vendo sistema não implementado. Tudo bem, então podemos fazer uma pausa aqui. Mais uma vez, você pode revisar, pausar e replicar se precisar. Mas quando voltarmos, começaremos a escrever a implementação. Portanto, temos algumas coisas que precisamos cobrir, incluindo a validação da OMS será tratada, em geral, e o que o método do controlador estará fazendo com base nos cenários. 25. Implemente o código para testes: Muito bem, temos os nossos testes de unidade escritos. Provavelmente ainda tem algum espaço para melhorias, mas dá-nos uma ideia geral do que precisamos de implementar para que o requisito básico seja feito. Então eu vou começar com a validação porque eu preciso de uma maneira de garantir que a validação está realmente sendo feita. A coisa legal sobre o dotnet Core é que nós só precisamos ir para o nosso modelo que sabemos que está chegando e configurar nossa validação. Então, apenas para verificar o quarto do livro está esperando pedidos de reserva de quarto. pedido de reserva de quarto na verdade não tem campos. Então, como adiciono validadores aos campos? Bem, lembre-se que é herdar do nosso método base, qual podemos adicionar as validações. E tudo o que está herdando dessa base, que seriam as solicitações, os resultados e o objeto de domínio real obteria essas regras de validação. Então o primeiro, que é o nome completo da pessoa que eu vou adicionar necessário. E que o comprimento da string deve ser maior, não deve ser mais do que 50. Pensável, ser um pouco afiado, cair nomes completos. Então deixe-me colocar isso a ele. É claro que, com base na sua regra de negócios, você adiciona suas validações de acordo. Tudo bem, no próximo, eu vou fazer o comprimento da corda o mesmo. Então, para o endereço de e-mail, eu também vou torná-lo necessário e, em seguida, eu posso adicionar que eu queria ser um endereço de e-mail. Tudo bem. A próxima, vou acrescentar que o fez, o tipo de dados é a TI. E neste ponto você poderia até pensar outras validações que você poderia colocá-lo em C que deve ser no futuro ou copiar no passado, esse tipo de coisas. Nesse ponto, você criaria um atributos personalizados ou você pode deixá-lo herdar do objeto invalidates. E isso terá que implementar este método aqui com o olho inumerável resultado de validação chamado validar e dando-lhe um contexto de validação. Então, neste ponto, eu provavelmente posso fazer algo como se b é menor do que o datetime Node.js. Muito bem, eis o que estou a ver. Se os dados fornecidos pelo usuário forem menores do que a data de hoje. Certo? Então eu vou produzir uma nova validação resultados onde eu enviar-lhes Sra., E deve ser no futuro. Então você pode twittar isso. Estou dizendo que deve ser um encontro futuro, então posso facilmente dizer onde é menor ou igual. Então isso significa que eles não podem reservar para que sejam nossas ações no passado. Devem estar no futuro. E, em seguida, o segundo parlamento, esse tipo de resultados de validação seria o nome ou nomes do membro. Nomes de membros porque é uma área onde você pode fornecer um valor, que é o que eu estou fazendo. Então, a mensagem de erro e, em seguida, a ária com membros que são afetados por esta validação. Então aqui eu estou vendo uma nova matriz passando em Nome fora da batida. Então, para isso, é apenas a chave que campo ou o nome do campo com o erro. O problema em fazer isso é que se eu mudar isso, a data da reserva mais tarde e esquecer de atualizar essa string, então haverá uma incompatibilidade. Então você vai querer fortemente digitado, vendo o nome off e, em seguida, o nome do campo. Então ele avalia que seria a versão string fora do nome do campo. E então os benefícios adicionais para isso seria que se eu fizer um refator global ou mesmo se eu refatorar esse nome e esquecer de alterá-lo aqui em baixo, eu vou apenas obter erros de compilador e eu não serei capaz empurrar esse código errado para produção. Então estas são as coisas à medida que avançamos. Sim, é um desenvolvimento orientado por testes. Mas ao fazer isso, vemos as práticas recomendadas que reduzem a probabilidade de erros à medida que avançamos em nosso código. Então eu adicionei toda aquela pequena validação à nossa base. Isso significa que, inerentemente, cada uma das variações de reserva de quarto saberá que tem essa validação básica. Tudo bem, então o que vemos aqui para resultar o pedido e sabemos que o objeto de domínio para reserva de quarto também terá isso. Agora em nosso controlador, precisamos colocar em algum código que lida com nossos cenários. Então a primeira coisa que vou fazer é verificar se o estado do modelo é válido. Então eu posso dizer se o modelo de estado é válido e isso seria informado pelos dados que chegam pelo pedido de reserva de quarto. E enquanto eu estou aqui, eu vou apenas deixá-lo saber que este é um post método HTTP, certo? Então este é HTTP post método. Então, basta chamar a barra de reserva de quarto com um pedido de post no travesseiro que se parece com nossos pedidos de reserva. Saberia que este é o lugar onde deveria, o objetivo. Então, se o estado do modelo é válido, então eu quero prosseguir para chamar o processador de reserva de quarto. E eu vou chamar o método da equipe de livros nos processos de reserva de quarto. Então, se formos válidos, então vá em frente e chame esse método. Tudo bem. Se, no entanto, o solo de inundação resultado, lembre-se que, na verdade, isso está retornando. Resultados à procura de quartos. Se olharmos e vermos qual é o resultado da sala, você vê aqui que conseguimos, mas não inundar, e obtemos a identificação. Então eu vou saber que eu estou pensando aparafusado mais inverno. Percebi que talvez haja outro cenário para o qual eu possa testar, mas tudo bem. Isso tem os resultados da reserva do quarto. Então var resultados é igual a qualquer resultado este termo, este retorna. Não, não seria prudente contar-lhes. Ok. Barco que você está reservando falhou porque lembre-se que este resultado tem que inundação sucesso ou falha. Então eu vou dizer se os resultados ponto inundação, desculpe se há uma inundação é equivalente a, e eu posso obter as enums bem ali. E eu vou dizer, se é equivalente ao sucesso, então eu quero devolver todos os fundos Keras ou transformar, ok, manter a massa com os resultados. Então lembre-se que esse resultado teria sido compilado por nossas salas de livros. Então este robô faça a corrente da margarida para ver. Então a sala do BOC está chamando resultado aqui, certo? E então estamos vendo cria isso com base nas solicitações de bookend. Então todos os campos que foram transferidos, certo? E então, se houver algum quarto disponível, então queremos retornar com o ID e a bandeira de sucesso. Isso é o que entra em resultados. Caso contrário, os resultados silicones sobre com todos os valores, apenas com a inundação falha. Tudo bem? Portanto, é isso que podemos fazer nessa situação. Então nós apenas retornamos a resposta OK com toda a carga útil resultado com o ID da reserva do quarto, o ID do quarto, toda a coisa, tudo o que teria sido compilado a partir daí. Então, se eu fizer todos os meus testes, vamos ver. Desculpe, estou recebendo um erro de compilação porque nem todos os caminhos de código retornam. Então eu vou devolver um pedido ruim aqui, certo? Faz, se ele não nos levar longe como o velho K, então eu só vou ver um retorno maus pedidos. Então deixe-me jogar nos meus testes de novo. E então você verá que eu tenho um teste verde e um vermelho. Então, o teste está vendo que ele deve ser de resultados de objeto de solicitação ruim, e foi apenas uma solicitação ruim resultados. Tudo bem, então isso traz à tona uma pergunta interessante. Qual é a diferença entre resultados de objeto de solicitação incorreta e resultados de uma solicitação incorreta? Bem, a mesma coisa com o caso antigo. Então os resultados do objeto OLC são diferentes, certo? Então você vê o resultado da chave antiga está lá porque não há parâmetros. Então, tudo bem, por si só significa sem parâmetros. No entanto, uma vez que você coloca parâmetros lá, uma vez que você está passando um objeto com a resposta, então ele se torna os resultados do objeto chave antigo. Pedido tão ruim por si só é o resultado da bateria pelos resultados das solicitações. Mas podemos colocar dados lá. Então, de modo geral, quando você retorna um pedido ruim, porque fora de uma validação de campo, você pode simplesmente colocar o estado do modelo lá. E todo o JSON saberá como desserializá-lo e apresentará ao usuário que estes são os pontos de validação baseados na falha, certo? Da mesma forma, quando a bandeira não é bem sucedida, eu provavelmente não quero dar-lhe o estado modelo porque a lei do estado modelo é válida. No entanto, a reserva falhou, talvez não houvesse quartos disponíveis ou algo assim. Não era realmente uma validação de campo para os resultados da bateria ou solicitação ruim. E é aqui que você provavelmente começa a ficar alto com base em como você deseja que seu design de API funcione. Bem, o que eu vou fazer, já passou na validação aqui. E digamos que não havia quartos disponíveis. Portanto, isso não nos deu a inundação de sucesso. Então aqui embaixo, claramente se não obtivéssemos a bandeira de sucesso que eles precisavam ou a chave eterna, uma vez que eu fui fazer é dizer modelos, o erro do modelo, certo? E este sou eu apenas assumindo que ele só chegou até aqui porque ele não conseguiu o subsídio Flau'jae era válido, mas não conseguiu a inundação de sucesso, Alguém tem um erro de modelo eu mesmo. E eu vou adicioná-lo ao nome fora. E o campo estará vindo da sala, vai cuidar campo data pedido ponto. Desde que eu só queria apontar, eles vão dizer importante usando este nome do parâmetro é. Porque mais uma vez, se nós refatorado, isso definitivamente seria considerado em qualquer lista de erros é uma lista de fatores de risco não. Então, é menos rastreamento em massa e tentar afiar cordas mágicas de osso que estão jogando fora do aplicativo. Então eu vou adicionar um estado modelo são apenas fez um D8. E eu vou ver que não há quartos disponíveis para uma determinada data. Tudo bem. Essa será a única razão pela qual se sentirá bem. Este pensamento baseado nas regras de negócios que temos até agora. E então isso seria adicionado a eles, todos esses dados, nós ainda retornamos o pedido ruim com o referido estado modelo. Tudo bem, então bem ali tudo de uma só vez onde ou retornando velho QA ou devolvendo o pedido de manteiga com os erros de validação. E este é um tipo de ad hoc baseado no processo, certo? Então vamos fazer todos os testes novamente. E agora você vai ver que eu tenho aquele carrapato verde, dois de dois passando e isso é excelente. Então você vê, nós apenas fizemos uma implementação rápida para atender a nossa lógica de teste em nosso poço, para conhecer a lógica dos artistas, correto, fizemos a implementação, mas implementamos algo que não estamos necessariamente testando para nossa contabilidade com artistas, que é essa bandeira de resultado. Então eu vou saltar de volta para o teste e eu vou adicionar isso para a seção test-driven. Então eu vou adicionar o enum aqui. Se eu me lembro, ele, vai marcar resultado bandeira ou adicionar alguém para adicionar que como um parâmetro ou teste orientado por dados, é anulado. E eu vou dizer bandeira resultado contabilidade. Então eu vou ter que acrescentar que os dados do interior devem, quando tudo for válido, ter essa bandeira para o sucesso. E quando as coisas não são válidas, ele também deve ter aquele vaso para o fracasso. Então, no meu intervalo, eu vou adicionar esta declaração se para ver se a bandeira de resultado do livro Rei tem um valor, significando que um foi fornecido, sim, um foi fornecido. E francamente, nem preciso torná-lo mais liberal, pensando nisso. Só estou pensando em apresentá-lo depois do fato. Mas eu sou o único no controle dos dados, então vou apresentá-los e deixá-los em paz. Então eu não tenho nenhum cenário em que seria não, qualquer maneira, não neste teste. Então deixe-me voltar atrás. Não é um parâmetro anulável. E estamos passando um para o sucesso, um para o fracasso. E então lembre-se que tivemos nosso campo de resultados sendo inicializado aqui em cima. E o acertar ver é que o método da sala do livro quando dado um pedido deve retornar um resultado. Então eu vou, eu estou vendo aqui é que qualquer valor é neste cenário ou nos dados que estão sendo passados para esse cenário, defina que seja o sinalizador para o objeto resultado, que vai ser retornado uma vez que esse método é chamado de qualquer maneira. Então eu só vou fazer esses testes mais uma vez só para ter certeza de que eu ainda vou estar recebendo uma nota de aprovação, certo? É sozinho. E lá vamos nós. Então eu ainda estou recebendo passes. E esses são todos os testes. Então eu vou apenas fazer todos os testes em vista e tudo está passando. Então, essa é uma maneira muito básica de testar sua API e, por extensão, sua aplicação web. Porque a única diferença real mais uma vez, entre eu testar uma API versus você testando páginas Razor acima ou um MVC up seria os tipos de retorno que você está testando para baseado em seu próprio país. Agora, de um modo geral, quando rende o MVC, você vai estar retornando uma visão ou redirecionando para outro. Redirecionar para outra visão, nosso radar para leilão em vez disso. Quando é o nosso Navalha páginas para cima, você está retornando página ou você está redirecionando para a página e você usa outro pj retorno, que é visto como resultados da página. Se não estou enganado. Assim, você pode redirecionar para os resultados da página. Normalmente fazer isso quando foi uma operação bem sucedida. Mas quando não é uma operação bem sucedida, você geralmente apenas retorna o pH. Lá vamos nós. Então eu só preciso que a biblioteca faça voltar para testar se você está apenas enviando resultados de backup comer. Tudo bem, então da mesma forma que, se for válido, você quer redirecionar para o arremesso. E se for inválido, você será devolvido aos resultados pagos na IUIE, você estaria mostrando ao usuário a página ao lado dos erros de estado do modelo, certo? Se fosse um MVC up, seria, vou digitar os resultados do leilão. Certo? Diga o que você vai haver um axônio resultados ou seria um redirecionamento para resultados de ação. Mas é praticamente a mesma coisa. Os cenários para os quais você está testando provavelmente diferem com base no aplicativo que você está testando. Mas, em última análise, os princípios são os mesmos. Então isso realmente vai parar esse menor. Sei que não ficamos muito complicados, mas fizemos o suficiente. Assim, você pode apreciar fluxos de baixo código inteiro e teste de unidade sagrada no nível do aplicativo, testando o que o controlador está fazendo e o que nossas afirmações podem acabar parecendo. Então eu encorajo você a criar os endpoints, ir em frente e fazer mais alguns testes e ver se você pode pensar em outros cenários que você provavelmente quer testar. Ficarei feliz em ouvir. E se alguma coisa, você me dá algum feedback e nós podemos trabalhar nisso de acordo. 26. Execute e teste de aplicação de Core ASP.NET: Muito bem, rapazes para tudo isto, sentados e testando. É hora de entregá-lo aos usuários do aplicativo para realmente testado para alterá-lo. Então, para colocar a API em funcionamento, precisamos de mais algumas configurações. Uma é a adição ao serviço, o contêiner COI, a fonte que precisamos, o serviço de reserva de sala de olhos, que está realmente falando com o banco de dados. Então, sim, temos o processador. O processador depende do serviço e nossa aplicação precisa saber que precisamos ter nossa representação do serviço para que possamos ter representação do processador. Então, novamente, vamos em frente e adicionar que serviços dot i serviço de reserva de quartos, serviço de reserva de quartos. E, claro, use seu ponto de controle para incluir qualquer coisa que esteja faltando. Agora podemos saltar para o nosso console do Gerenciador de Pacotes. E se não é onde você vê isso na minha tela por si mesmo, você pode ir em frente e bater ferramentas NuGet, gerenciador de pacotes, e para obter o console. Até agora este console, queremos mudar o nosso projeto alvo para o projeto de persistência. Por quê? Porque é aí que nosso contexto de banco de dados vive. Então, todas as bibliotecas e assim por diante para os comandos estão prestes a ser executados ao vivo nesse projeto, nós só precisávamos apontar para lá. Então eu vou dizer adicionar migração traço, e eu vou dizer migração inicial. Então, o remédio rápido para esse erro é obter o pacote de design no projeto API, certo? Então, se eu bater persistência, você vai notar que ele tem todo este bloco XML dedicado ao pacote de design. Então, na verdade, vou copiar isto. E eu acho que outra modificação que precisamos fazer é esta dois diferente nós somos biblioteca central. Eu acho que quando criamos essa persistência, usamos o SQL Server. Então, e então quando chegamos à API, decidimos, Ok, vamos usar luz SQL. Então, se você quiser continuar usando o SQL Server, você está confortável com isso resolvido, então tudo bem. Nenhum problema faz com que você altere o nosso próprio, a cadeia de conexão e tudo para a API. Caso contrário, se você só quiser me seguir e ter certeza de que não tem problemas, você pode ir em frente e mudar isso. Você pode simplesmente alterar o verbiage do SQL Server para o SQL IT. Tudo bem, então eu e aquele troco, mas ainda copiamos todo este bloco para o projeto. E vamos saltar para a API, certifique-se de que isso também diz SQL ITE e, em seguida, escrever um mural disso. Eu só vou colar aquele bloco de design, alguém para fazer uma construção. E nesse ponto o projeto API sem pegar que ele tem esse pacote de design. E então eu posso voltar para o meu PCM e tentar essa migração novamente. E depois de uma compilação bem-sucedida, você verá que sabemos que temos nossa primeira migração com sucesso. Então, depois de termos a migração, só precisamos dizer que é banco de dados. E isso está feito. Então vamos dar uma olhada em tudo o que temos. Temos quartos de reservas de quartos. Estas são todas as tabelas que criamos e alguns dados em que teríamos visto. Então você vê que nós temos quartos. Veja isso dentro. Se desejar, você pode criar um endpoint onde o usuário pode obter a lista de salas. Você pode criar outro endpoint para obter a lista de salas disponíveis. Mas o ponto do TDD é que você vai ter que escrever o teste primeiro e então você implementar. Tudo bem, então acho que já te dei munição suficiente para que possas ir e fazê-las sozinha. Por enquanto, vamos testar a API apenas para ter certeza de que nosso código para o qual temos excelente cobertura realmente funciona. Então, porque durante a criação da API tivemos marcado, incluir o suporte à API aberta, temos este Swagger, certo? Então, se você não está familiarizado com o futebol, é uma ferramenta poderosa útil tanto teste quanto documentação de APIs. Se você está familiarizado com ele, então isso deve ser um acéfalo tem que segurar para usá-lo. Então aqui você vê que eles nos dão um exemplo do que é esperado quando estamos prestes a fazer um pedido post para uma reserva de quarto. Se eu clicar em Experimentar, e eu não vou mudar os nossos próprios valores. Eu só vou clicar em Executar, então eu recebo esse erro de aparência desagradável. Então eu só vou ler através dele e ele está vendo SQLite exceto Norte. Então, dividido, há algo que eu perdi com as configurações. Eu só vou saltar de volta para o bloco de código no arquivo inicial, nós temos nossa conexão, nós temos ou contexto AV. E acho que preciso de mais algumas linhas para garantir que o banco de dados seja criado. Então eu simplesmente amo este método, garantir banco de dados criado e eu estou dando-lhe o, o parâmetro para a conexão SQLite. Então, há controller.js e gerar este método que pode ser privado e estático. Agora, para isso, o que vou fazer é. Objeto Builder. Então, em todo o objeto construtor já. Então este tem sido para ser um novo construtor de opções de contexto de banco de dados do tipo contextos DVI que estamos usando. E então saber que temos que eu vou dizer construtor, você é suposto usar SQL lite, certo? Por isso, vou copiar isto. Depois de tudo isso, eu vou dizer que usar var ou contextos é igual a uma nova instância de contextos RDB. Então me desculpe, eu perdi essas linhas mais cedo. Então vamos apenas passar nas opções do ponto do construtor porque eu preciso dar as opções a qualquer momento que instanciar isso. E então vamos dizer contextos, banco de dados ponto, ponto garantir criado. Tudo bem. Estamos apenas adicionando isso garante que o banco de dados seja criado. Sim, nós brigamos em tudo isso, mas então por causa da natureza do banco de dados, precisamos ter certeza que ele realmente é criado em tempo de execução. Certo, então vamos tentar de novo. Então, saltando de volta para a arrogância e fazendo a caixa de transporte e a execução e saber quem você vê algo olhando um pouco melhor. Então o que estamos vendo aqui é a resposta. Então, quero dizer, há oportunidades, é claro, de limpá-lo. Então, porque você vê aqui a inundação é 000 porque a bandeira de sucesso foi 0 e a inundação de falha foi um. Poderíamos ir e, claro, mudar os valores de enumeração. Ou podemos alterar o campo de resultado para o dilúvio para ser uma string e realmente imprimir as palavras, o sucesso ou fracasso em conformidade. Isso é com você. Se eu colocar em algo que é inválido, como eu coloquei em um feito que foi no mês passado e tentar executar isso. Então você vê aqui eu estou recebendo aquele estado modelo 400 ou onde as ações devem estar no futuro. Certo, então esses são os tipos de coisas que implementamos e testamos para que saibamos o comportamento uma vez que tentamos o cenário em praticidade. Então esses são os diferentes níveis de teste que passamos por nosso ciclo vermelho-verde, podem garantir que nosso código era à prova de balas em qualquer medida que fizemos. E então saber quando o cliente está testando, eles teriam obtido seu documento de teste para ver. Aqui estão os seus cenários de teste e certifique-se de que estes são os resultados. Qualquer variação disso resultaria em eles quererem dizer-te para refatorar. Então, se eu colocar em alguns invalidados, isso é ver o 18º mês do ano e eu clicar em Executar, isso vai levar a uma falha. Então, sim, ainda é um pedido ruim e sim, estou tentando obter alguns objetos aqui. Você está vendo que o valor JSON não pôde ser convertido, mas isso provavelmente não é o que um usuário precisa ver ou alguém consumindo a API. Então, neste momento e todo o seu departamento de QA voltaria para você e dizer, hey, você sabe, sob esta circunstância isso acontecer, por favor ligue para eles, não vi isso para isso. Então você volta, você escreve um teste para ter certeza de que um cenário como esse não existe ou se comporta dessa maneira. Ou você escreve o teste de acordo com como você quer que ele se comporte. E então você escreve o código para ter certeza que ele faz isso. Então, em poucas palavras, isso é um desenvolvimento orientado por testes com C-Sharp. Quando voltarmos, podemos fazer uma breve recapitulação de tudo o que passamos e, em seguida, concluir. 27. Revisão do curso: Certo, pessoal, então vocês chegaram à palestra final deste curso. Eu confio que você desenvolveu seu conhecimento de desenvolvimento orientado por testes com núcleo botnet. E mesmo que tenhamos aprendido o núcleo dotnet aqui, os fundamentos dele podem ser aplicados a qualquer outro framework ou qualquer outra linguagem que você possa acabar usando. Você tem unidade PHP para desenvolvimento PHP, você tem JUnit para desenvolvimento Java, até mesmo Angelo e reagir. Todos eles têm suas próprias estruturas de teste de unidade e os princípios são os mesmos. Desenvolvimento orientado por testes significa que você vai escrever o teste de unidade vai falhar. Você escreve o código e depois faz com que ele passe em frente. Ao fazer esse ciclo, você vê como você precisa para Wonky, querido frio tipo de separado. Então, o que eu queria salientar é que nós empregamos a separação de preocupações em todos os níveis. Ele tentou quebrar todas as diferentes partes da nossa aplicação em seus próprios projetos. Assim, a API foi por si só. O núcleo, a lógica de negócios era por si só. E então nós tivemos as operações relacionadas aos dados por si mesmos. modo geral, este é apenas um modelo baseado em seu contexto. Você pode acabar com mais ou menos projetos. Mas o ponto é que quando você tem eles quebrados em aqueles tamanhos de contas são unidades, torna muito mais fácil para você testar as diferentes camadas de sua aplicação para garantir que cada camada está agindo como deveria. E, em seguida, o teste de unidade em si garante que esse componente ou essa funcionalidade de função nesse componente ou nessa camada está agindo como deveria. Então temos a persistência com todas as operações de dados, com o núcleo, com a lógica de negócios, todas as declarações if e tomar as decisões. Admitimos este encontro ou não, esse tipo de coisa. E então adicionamos a API, que basicamente representa o aplicativo. Poderia ter sido uma interface do usuário. A API devido à menor sobrecarga necessária com a interface do usuário e assim por diante. Mas os princípios de teste e desenvolvimento para permanecer razoavelmente os mesmos. Ao longo desta jornada também aprendeu que em testes de unidade você tem diferentes tipos de testes de unidade, projetos, pelo menos com núcleo dotnet, você tem MSTest, que é baunilha, que é direto da Microsoft. Você tem x unidades e você tem n unidades? Cada um tem seus próprios prós e contras. Neste discurso, usamos x unidades. E nós vimos que poderíamos escrever testes orientados por testes, desculpe, conduzidos por dados onde criamos uma teoria e então poderíamos simplesmente passar em valores que representam os diferentes cenários. Considerando que em outros frameworks pode não ser tão fácil com o meu difícil para escrever um teste de unidade para o tiro e um R1 para quando é válido e embora 14 e é inválido. E então para talvez 23 testes que você teria escrito em outros frameworks, você teria escrito apenas um teste, mas com dados diferentes sendo passados para os cenários. E para mim isso também ajuda a organizar o código porque então eu tenho que estar atento e saber que este método ou representa o que o método que eu estou testando deve fazer. Então, em circunstâncias diferentes, qual seria a coluna antiga? Então, na minha mente, isso me ajudou a ter certeza de que estou escrevendo código que inclui os diferentes cenários. E escreva o mínimo de código possível, mas apenas o suficiente para ter certeza de que meus campos de teste de unidade são o meu cenário realmente se concretizam. Então fizemos testes de nível de aplicativo, fizemos persistência dos testes, e fizemos testes de lógica de negócios, e todos eles até agora são verdes quando tudo isso, quando fazemos o nosso cacete, não introduzimos algo ao nosso código. Nós sempre queremos ter certeza de que os testes estão passando e então podemos seguir em frente. Então, com tudo o que foi dito e feito, eu só vou verificar as mudanças. E essa é a minha mensagem. Então eu vou em frente e cometer tudo e afundar. E você pode ver o código-fonte mais recente. Se precisar dele nos recursos. Então, obrigado por ficar comigo e te vejo em breve.