Onde posso encontrar documentação para as classes de fábrica WP_UnitTestCase?

21

Nas versões recentes WP_UnitTestCase, incluiu uma $factorypropriedade.

Por exemplo:

$post = $this->factory->post->create();

Onde posso encontrar documentação sobre esse recurso útil?

djb
fonte

Respostas:

26

Até onde eu sei, não há documentação para isso no momento. A fonte oficial está aqui .

Também escrevi um tutorial sobre testes de unidade de plug-ins do WordPress, que fornece alguns detalhes sobre esse recurso .

Uma das vantagens do uso WP_UnitTestCasesão suas fábricas. Estes podem ser acessados ​​através da factoryvariável de membro. O factoryé um objeto com propriedades que são cada uma instância de uma das classes definidas em includes / factory.php . O que eles fazem, você pergunta? Eles tornam muito simples a criação de usuários, postagens, termos etc., sempre que você precisar deles em seu teste. Então, em vez de fazer isso:

$args = array( /* A bunch of user data you had to make up */ );
wp_insert_user( $args );

Você pode fazer isso:

$user_id = $this->factory->user->create();

Mas espere, isso fica ainda melhor. E se você precisar de muitos usuários (ou postagens, ou o que for)? Você pode apenas criá-los em massa assim:

$user_ids = $this->factory->user->create_many( 25 );

Isso criará 25 usuários que você pode usar em seu teste.

O factorypossui as seguintes propriedades que você pode usar:

  • $post
  • $attachment
  • $comment
  • $user
  • $term
  • $category
  • $tag
  • $blog

Todos eles podem ser usados ​​da mesma maneira que demonstrada no exemplo acima com a $userfábrica. Por exemplo, você pode criar uma postagem como esta:

$this->factory->post->create();

Você também pode especificar argumentos específicos a serem usados ​​para criar o objeto. No exemplo acima, criamos uma postagem, mas ela não foi atribuída a um usuário específico (o post_authorcampo será o padrão 0). Às vezes, podemos querer que a postagem seja atribuída a um usuário. Faríamos isso assim:

$user_id = $this->factory->user->create();
$post_id = $this->factory->post->create( array( 'post_author' => $user_id ) );

Além disso, se você precisar mais do que apenas o ID do objeto que está criando, não precisará fazer isso:

$post_id = $this->factory->post->create();
$post = get_post( $post_id );

Em vez disso, use o create_and_get()método:

// $post will be an instance of WP_Post 
$post = $this->factory->post->create_and_get();

Neste exemplo, usamos a postfábrica, mas o mesmo vale para todas as fábricas.

Acho que vou mencionar isso para a equipe de documentos do WordPress. Talvez possamos colocar essas coisas nos manuais de plugins e temas.

Atualização (20 de junho de 2015): Você também pode criar suas próprias fábricas personalizadas !

Atualização (27 de setembro de 2016): No WordPress 4.4, os testes foram atualizados para fornecer um factory()método estático para acessar as fábricas, embora a factorypropriedade ainda seja fornecida por um getter mágico.

JD
fonte
O domínio está inoperante e o link para o tutorial também. Foi movido?
Josh Habdas
@ Josh Parece que está de volta agora. Você provavelmente acessou enquanto o site estava executando um backup no meio da noite (meu fuso horário).
JD
@ Josh Não conheço nenhuma estrutura de teste de unidade que use código de procedimento para os testes. Eu realmente duvido que uma estrutura de teste processual funcionaria quase tão bem quanto uma OO de qualquer maneira, apenas por causa de como ela precisa funcionar. No entanto, apenas porque os testes são construídos em uma estrutura orientada a objetos, como o PHPUnit, não determina que eles possam apenas testar o código OO. Eu tenho muitos códigos procedurais dos meus plugins e testo exatamente da mesma maneira. O WordPress também testa muito código processual dessa maneira. Portanto, isso não deve ser problema.
JD
Obrigado, @JD. Idealmente, também gostaria de escrever meus testes dessa maneira. Mas vou me submeter à OOP, uma vez que não está na linha principal. PS Tentei enviar um comentário no seu blog e recebi um erro. cara squinty Independentemente disso, obrigado pela 411.
Josh Habdas
1
@ Josh Obrigado pelo aviso sobre o problema com comentários, isso deve ser corrigido agora. Foi causado por um plug-in anti-spam excessivamente zeloso.
JD
2

O código fonte em

https://github.com/rnagle/wordpress-unit-tests/blob/master/includes/factory.php

parece ser o melhor lugar para se olhar no momento

djb
fonte
2
Basta remover o link da sua pergunta: o que você leria? Por favor, sempre escreva respostas que não confiam em fontes externas. Caso contrário, precisaremos excluir sua resposta.
Kaiser #
2
@ Kaiser, vejo de onde você vem, mas a resposta para minha pergunta será um link. Certamente você não esperaria que alguém publicasse toda a documentação aqui?
djb
2
Sim, esperamos que alguém publique todo o código relevante aqui. Isso está incluso nas Perguntas frequentes do site - "Sempre cite a parte mais relevante de um link importante, caso o site de destino esteja inacessível ou fique permanentemente offline." Esse pode não ser o conteúdo inteiro do recurso vinculado, mas, nesse caso, pode ser. Como é, quando esse recurso do GitHub se torna inacessível, essa resposta se torna sem sentido.
s_ha_dum