Aaron Benton é um arquiteto experiente, especializado em soluções criativas para desenvolver aplicativos móveis inovadores. Ele tem mais de 10 anos de experiência em desenvolvimento de pilha completa, incluindo ColdFusion, SQL, NoSQL, JavaScript, HTML e CSS. Atualmente, Aaron é Arquiteto de Aplicativos da Shop.com em Greensboro, Carolina do Norte, e é um Campeão da comunidade do Couchbase.
FakeIt Série 4 de 5: Trabalhando com dados existentes
Até agora, em nosso Falsa vimos como podemos Gerar dados falsos, Compartilhar dados e dependênciase usar Definições para modelos menores. Hoje vamos examinar o último recurso importante da FakeIt, que é trabalhar com dados existentes por meio de entradas.
Raramente, como desenvolvedores, temos a vantagem de trabalhar em aplicativos novos, pois nossos domínios são, na maioria das vezes, compostos por diferentes bancos de dados e aplicativos legados. Como estamos modelando e criando novos aplicativos, precisamos fazer referência e usar esses dados existentes. Falsa permite que você forneça dados existentes aos seus modelos por meio de arquivos JSON, CSV ou CSON. Esses dados são expostos como uma variável de entrada em cada uma das funções *run e *build dos modelos.
Modelo de usuários
Começaremos com o nosso modelo users.yaml que atualizamos em nossa última atualização publicação recente para usar Endereço e Telefone definições.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
nome: Usuários tipo: objeto chave: _id dados: min: 1000 máximo: 2000 propriedades: _id: tipo: string descrição: O documento id construído por o prefixo "user_" e o usuários id dados: post_build: "`user_${this.user_id}`" tipo de documento: tipo: string descrição: O documento tipo dados: valor: "usuário" user_id: tipo: inteiro descrição: Um automático-incrementando número dados: construir: documento_índice primeiro_nome: tipo: string descrição: O usuários primeiro nome dados: construir: falsificador.nome.firstName() sobrenome: tipo: string descrição: O usuários último nome dados: construir: falsificador.nome.lastName() nome de usuário: tipo: string descrição: O nome de usuário dados: construir: falsificador.Internet.nome de usuário() senha: tipo: string descrição: O usuários senha dados: construir: falsificador.Internet.senha() endereço de e-mail: tipo: string descrição: O usuários e-mail endereço dados: construir: falsificador.Internet.e-mail() created_on: tipo: inteiro descrição: Um época tempo de quando o usuário foi criado dados: construir: novo Data(falsificador.data.passado()).getTime() endereços: tipo: objeto descrição: Um objeto contendo o casa e trabalho endereços para o usuário propriedades: casa: descrição: O usuários casa endereço esquema: $ref: '#/definitions/Address' (#/definições/endereço) trabalho: descrição: O usuários trabalho endereço esquema: $ref: '#/definitions/Address' (#/definições/endereço) telefone_principal: descrição: O usuários principal telefone número esquema: $ref: '#/definitions/Phone' dados: post_build: | excluir este.telefone_principal.tipo retorno este.principal_telefone additional_phones: tipo: matriz descrição: O usuários adicionais telefone números itens: $ref: '#/definitions/Phone' dados: min: 1 máximo: 4 definições: Telefone: tipo: objeto propriedades: tipo: tipo: string descrição: O telefone tipo dados: construir: falsificador.aleatório.arrayElement([ "Casa, "Trabalho, 'Celular', "Outros ]) número de telefone: tipo: string descrição: O telefone número dados: construir: falsificador.telefone.número de telefone().substituir(/[^0-9]+/g, '') extensão: tipo: string descrição: O telefone extensão dados: construir: chance.bool({ probabilidade: 30 }) ? chance.inteiro({ min: 1000, máximo: 9999 }) : nulo Endereço: tipo: objeto propriedades: endereço_1: tipo: string descrição: O endereço 1 dados: construir: `${falsificador.endereço.streetAddress()} ${falsificador.endereço.streetSuffix()}` endereço_2: tipo: string descrição: O endereço 2 dados: construir: chance.bool({ probabilidade: 35 }) ? falsificador.endereço.secondaryAddress() : nulo localidade: tipo: string descrição: O cidade / localidade dados: construir: falsificador.endereço.cidade() região: tipo: string descrição: O região / estado / província dados: construir: falsificador.endereço.stateAbbr() código postal: tipo: string descrição: O zíper código / postal código dados: construir: falsificador.endereço.código postal() país: tipo: string descrição: O país código dados: construir: falsificador.endereço.countryCode() |
Atualmente, nossos Endereço está gerando um país aleatório. E se o nosso site de comércio eletrônico oferecer suporte apenas a um pequeno subconjunto dos 195 países? Digamos que suportemos seis países para começar: US, CA, MX, UK, ES, DE. Poderíamos atualizar a propriedade country das definições para obter um elemento de matriz aleatório:
(Para fins de brevidade, as outras propriedades foram deixadas de fora da definição do modelo)
1 2 3 4 5 6 |
... país: tipo: string descrição: O país código dados: construir: falsificador.aleatório.arrayElement(["EUA, "CA, 'MX', "REINO UNIDO, "ES, "DE]); |
Embora isso funcione, e se tivermos outros modelos que dependam dessas mesmas informações de país, teremos que duplicar essa lógica. Podemos fazer a mesma coisa criando um arquivo countries.json e adicionando uma propriedade inputs à propriedade data, que pode ser um caminho absoluto ou relativo para a nossa entrada. Quando o modelo for gerado, nosso arquivo countries.json será exposto a cada uma das funções de criação de modelos por meio do argumento inputs como inputs.countries
(Para fins de brevidade, as outras propriedades foram deixadas de fora da definição do modelo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
nome: Usuários tipo: objeto chave: _id dados: min: 1000 máximo: 2000 insumos: ./países.json propriedades: ... definições: ... país: tipo: string descrição: O país código dados: construir: falsificador.aleatório.arrayElement(insumos.países); países.json [ "EUA", "CA", "MX", "REINO UNIDO", "ES", "DE" ] |
Ao alterar uma linha existente e adicionar outra linha no modelo, fornecemos dados existentes ao nosso modelo de Usuários. Ainda podemos gerar um país aleatório, com base nos países que nosso aplicativo suporta. Vamos testar nossas alterações usando o seguinte comando:
1 |
falso console --contagem 1 modelos/usuários.yaml |
Modelo de produtos
Nosso aplicativo de comércio eletrônico está usando um sistema separado para categorização. Precisamos expor esses dados aos nossos produtos gerados aleatoriamente para que possamos usar informações de categoria válidas. Começaremos com o products.yaml que definimos na seção FakeIt Série 2 de 5: Dados compartilhados e dependências postar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
produtos.yaml nome: Produtos tipo: objeto chave: _id dados: min: 4000 máximo: 5000 propriedades: _id: tipo: string descrição: O documento id dados: post_build: `produto_${este.product_id}` tipo de documento: tipo: string descrição: O documento tipo dados: valor: produto product_id: tipo: string descrição: Único identificador representando a específico produto dados: construir: falsificador.aleatório.uuid() preço: tipo: duplo descrição: O produto preço dados: construir: chance.flutuante({ min: 0, máximo: 150, fixo: 2 }) preço de venda: tipo: duplo descrição: O produto preço dados: post_build: | deixar preço de venda = 0; se (chance.bool({ probabilidade: 30 })) { preço de venda = chance.flutuante({ min: 0, máximo: este.preço * chance.flutuante({ min: 0, máximo: 0.99, fixo: 2 }), fixo: 2 }); } retorno preço de venda; nome_de_exibição: tipo: string descrição: Tela nome de produto. dados: construir: falsificador.comércio.productName() short_description: tipo: string descrição: Descrição de produto. dados: construir: falsificador.lorem.parágrafos(1) long_description: tipo: string descrição: Descrição de produto. dados: construir: falsificador.lorem.parágrafos(5) palavras-chave: tipo: matriz descrição: Um matriz de palavras-chave itens: tipo: string dados: min: 0 máximo: 10 construir: falsificador.aleatório.palavra() disponibilidade: tipo: string descrição: O disponibilidade status de o produto dados: construir: | deixar disponibilidade = 'Em estoque'; se (chance.bool({ probabilidade: 40 })) { disponibilidade = falsificador.aleatório.arrayElement([ 'Pré-encomenda', "Fora de estoque, "Descontinuado ]); } retorno disponibilidade; data_disponibilidade: tipo: inteiro descrição: Um época tempo de quando o produto é disponível dados: construir: falsificador.data.recente() post_build: novo Data(este.data_disponibilidade).getTime() produto_slug: tipo: string descrição: O URL amigável versão de o produto nome dados: post_build: falsificador.ajudantes.slugify(este.nome_de_exibição).toLowerCase() categoria: tipo: string descrição: Categoria para o Produto dados: construir: falsificador.comércio.departamento() categoria_slug: tipo: string descrição: O URL amigável versão de o categoria nome dados: post_build: falsificador.ajudantes.slugify(este.categoria).toLowerCase() imagem: tipo: string descrição: Imagem URL representando o produto. dados: construir: falsificador.imagem.imagem() alternate_images: tipo: matriz descrição: Um matriz de alternativo imagens para o produto itens: tipo: string dados: min: 0 máximo: 4 construir: falsificador.imagem.imagem() |
Nossos dados de categorias existentes foram fornecidos em formato CSV.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
categorias.csv "category_id","category_name","category_slug" 23,"Eletrônicos","eletrônicos" 1032,"Materiais de escritório","material de escritório" 983,"Roupas e vestuário","vestuário e acessórios" 483,"Filmes, músicas e livros","filmes-música-e-livros" 3023,"Esportes e condicionamento físico","esportes e condicionamento físico" 4935,"Automotivo","automotivo" 923,"Ferramentas","ferramentas" 5782,"Móveis para casa","móveis para casa" 9783,"Saúde e beleza","saúde e beleza" 2537,"Brinquedos","brinquedos" 10,"Videogames","video-games" 736,"Suprimentos para animais de estimação","pet-supplies" (suprimentos para animais de estimação) |
Agora precisamos atualizar nosso modelo products.yaml para usar esses dados existentes.
(Para fins de brevidade, as outras propriedades foram deixadas de fora da definição do modelo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
nome: Produtos tipo: objeto chave: _id dados: min: 4000 máximo: 5000 insumos: - ./categorias.csv pre_build: globais.current_category = falsificador.aleatório.arrayElement(insumos.categorias); propriedades: ... category_id: tipo: inteiro descrição: O Categoria ID para o Produto dados: construir: globais.current_category.categoria_id categoria: tipo: string descrição: Categoria para o Produto dados: construir: globais.current_category.categoria_nome categoria_slug: tipo: string descrição: O URL amigável versão de o categoria nome dados: post_build: globais.current_category.categoria_lesma ... |
Há alguns aspectos a serem observados sobre como atualizamos nosso modelo products.yaml.
- inputs: é definido como uma matriz e não como uma cadeia de caracteres. Embora estejamos usando apenas uma única entrada, você pode fornecer quantos arquivos de entrada forem necessários para o seu modelo.
- Uma função pre_build é definida na raiz do modelo. Isso ocorre porque não podemos pegar um elemento de matriz aleatório para cada uma de nossas três propriedades de categoria, pois os valores não corresponderiam. Toda vez que um documento individual for gerado para o nosso modelo, essa função pre_build será executada primeiro.
- Cada uma de nossas funções de construção de propriedades de categoria faz referência à variável global definida pela função pre_build em nosso modelo.
Podemos testar nossas alterações usando o seguinte comando:
1 |
falso console --contagem 1 modelos/produtos.yaml |
Conclusão
A capacidade de trabalhar com dados existentes é um recurso extremamente poderoso do Falsa. Ele pode ser usado para manter a integridade de documentos gerados aleatoriamente para trabalhar com o sistema existente e pode até mesmo ser usado para transformar dados existentes e importá-los para o Couchbase Server.
Próximo
Anterior
- FakeIt Série 1 de 5: Geração de dados falsos
- FakeIt Série 2 de 5: Dados compartilhados e dependências
- Série FakeIt 3 de 5: Modelos Lean por meio de definições
Esta postagem faz parte do Programa de Redação da Comunidade Couchbase