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.

Série FakeIt 3 de 5: Modelos Lean por meio de definições
Em nossa postagem anterior FakeIt Série 2 de 5: Dados compartilhados e dependências, vimos como criar dependências de vários modelos com a FakeIt. Hoje, veremos como podemos criar os mesmos modelos, porém menores, aproveitando as definições.
As definições são uma forma de criar conjuntos reutilizáveis em seu modelo. Elas permitem que você defina um conjunto de propriedades/valores uma única vez, referenciando-os várias vezes em seu modelo. As definições em um modelo FakeIt são muito semelhantes ao modo como as definições são usadas no Swagger / Especificação de API aberta.
Modelo de usuários
Começaremos com nosso modelo users.yaml que definimos em nosso primeira publicação.
|
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 |
nome: Usuários tipo: objeto chave: _id propriedades: _id: tipo: string descrição: O documento id construído por o prefixo "user_" e o usuários id dados: post_build: `usuário_${este.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() |
Digamos que temos um novo requisito em que precisamos oferecer suporte a um endereço residencial e comercial para cada usuário. Com base nesse requisito, decidimos criar uma propriedade de nível superior chamada endereços que conterá propriedades aninhadas de residência e trabalho.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ ... "endereços": { "casa": { "address_1": "123 Broadway St", "address_2": "Apt. C", "localidade": "Greensboro", "region" (região): "NC", "postal_code": "27409", "país": "EUA" }, "trabalho": { "address_1": "321 Morningside Ave", "address_2": "", "localidade": "Greensboro", "region" (região): "NC", "postal_code": "27409", "país": "EUA" } } } |
Nosso modelo users.yaml precisará ser atualizado para dar suporte a essas novas propriedades de endereço.
(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 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 |
... propriedades: ... endereços: tipo: objeto descrição: Um objeto contendo o casa e trabalho endereços para o usuário propriedades: casa: tipo: objeto descrição: O usuários casa endereço 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() trabalho: tipo: objeto descrição: O usuários casa endereço 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() |
Como você pode ver, nossas propriedades de endereço residencial e comercial contêm exatamente as mesmas propriedades aninhadas. Essa duplicação torna nosso modelo maior e mais detalhado. Além disso, o que acontecerá se nossos requisitos de endereço precisarem mudar? Teríamos que fazer duas atualizações para manter a mesma estrutura. É nesse ponto que podemos tirar proveito das definições, definindo uma única maneira de criar um endereço e fazer referência a ele.
(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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
... propriedades: ... 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) definições: 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() |
As definições são definidas na raiz do modelo, especificando uma propriedade definitions: e, em seguida, o nome da definição. As definições são referenciadas usando $ref com o valor sendo o caminho para a definição, por exemplo, #/definitions/Address. Com o uso de definições, economizamos quase 30 linhas de código em nosso modelo e criamos um único local para a definição e a geração de um endereço em nosso modelo de usuários.
Podemos testar a saída de nossos endereços de modelo de usuários atualizados usando o seguinte comando:
|
1 |
falso console --contagem 1 modelos/usuários.yaml |

Agora, digamos que tenhamos um requisito para armazenar o número de telefone principal de um usuário e, em seguida, armazenar números de telefone adicionais opcionais, ou seja, residencial, comercial, celular, fax etc. Para essa alteração, usaremos duas novas propriedades de nível superior: main_phone e additional_phones, que são uma matriz.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ ... "main_phone": { "phone_number" (número de telefone): "7852322322", "extensão": nulo }, "additional_phones": [ { "phone_number" (número de telefone): "3368232032", "extensão": "3233", "tipo": "Trabalho" }, { "phone_number" (número de telefone): "4075922921", "extensão": nulo, "tipo": "Móvel" } ] } |
Embora esse possa não ser o modelo de dados mais prático, ou como eu pessoalmente teria modelado esses dados, podemos usar esse exemplo novamente para ilustrar como podemos tirar proveito do uso de definições em nosso modelo FakeIt.
(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 28 29 30 31 32 33 34 35 36 37 38 |
... propriedades: ... 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 |
Para este exemplo, criamos uma definição de Phone que contém 3 propriedades: type, phone_number e extension. Você notará que definimos uma função post_build na propriedade main_phone que remove o atributo type. Isso ilustra como as definições podem ser usadas em conjunto com uma função de compilação para manipular o que é retornado pela definição. A propriedade additional_phones é uma matriz de definições de telefone que gerará entre 1 e 4 telefones. Podemos testar a saída dos números de telefone do nosso modelo Users atualizado usando o seguinte comando:
|
1 |
falso console --contagem 1 modelos/usuários.yaml |

Conclusão
As definições permitem que você simplifique seus modelos FakeIt criando conjuntos reutilizáveis de código para modelos menores e mais eficientes.
Próximo
- FakeIt Série 4 de 5: Trabalhando com dados existentes
- FakeIt Series 5 de 5: Desenvolvimento móvel rápido com o Sync-Gateway
Anterior
- FakeIt Série 1 de 5: Geração de dados falsos
- FakeIt Série 2 de 5: Dados compartilhados e dependências
Esta postagem faz parte do Programa de Redação da Comunidade Couchbase