Где я могу найти документацию для фабричных классов WP_UnitTestCase?


21

В последних версиях WP_UnitTestCaseесть $factoryсвойство.

Например:

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

Где я могу найти документацию по этой полезной функции?

Ответы:


26

Насколько я знаю, в настоящее время нет документации для этого. Официальный источник здесь .

Я также написал учебник по модульному тестированию плагинов WordPress, в котором подробно рассказывается об этой функции .

Одним из преимуществ использования WP_UnitTestCaseявляются его фабрики. К ним можно получить доступ через factoryпеременную-член. Это factoryобъект со свойствами, каждый из которых является экземпляром одного из классов, определенных в include / factory.php . Вы спрашиваете, что они делают? Они очень упрощают создание пользователей, сообщений, терминов и т. Д., Где бы они вам ни понадобились в тесте. Итак, вместо того, чтобы делать это:

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

Вы можете просто сделать это:

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

Но подождите, это становится еще лучше. Что делать, если вам нужно много пользователей (или сообщений, или что-то еще)? Вы можете просто создать их оптом, как это:

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

Это создаст 25 пользователей, которых вы сможете использовать в своем тесте.

factoryОбладает следующими свойствами , которые можно использовать:

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

Все они могут быть использованы таким же образом, как показано в примере выше на $userзаводе. Например, вы можете создать пост, подобный этому:

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

Вы также можете указать конкретные аргументы для использования при создании объекта. В приведенном выше примере мы создали сообщение, но оно не было назначено конкретному пользователю ( post_authorполе по умолчанию будет 0). Иногда мы можем захотеть, чтобы пост был назначен пользователю. Мы сделаем это так:

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

Кроме того, если вам нужно больше, чем просто идентификатор объекта, который вы создаете, вам не нужно делать это:

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

Вместо этого используйте create_and_get()метод:

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

В этом примере мы использовали postфабрику, но то же самое относится ко всем фабрикам.

Я думаю, что упомяну об этом команде разработчиков WordPress. Может быть, мы сможем получить этот материал в руководствах по плагину и темам.

Обновление (20 июня 2015 г.): Вы также можете создавать свои собственные фабрики !

Обновление (27 сентября 2016 г.): В WordPress 4.4 тесты были обновлены, чтобы обеспечить статический factory()метод доступа к фабрикам, хотя factoryсвойство все еще предоставляется через магический метод получения .


Домен мертв, и поэтому ссылка на учебник. Это было перемещено?
Джош Хабдас

@JoshH Похоже, теперь снова. Вы, вероятно, нажали это, когда сайт выполнял резервное копирование в середине ночи (мой часовой пояс).
JD

@JoshH Я не знаю ни одного фреймворка для модульного тестирования, использующего процедурный код для тестов. Я действительно сомневаюсь, что процедурная среда тестирования в любом случае будет работать почти так же хорошо, как и ОО, только потому, что она должна работать. Однако только потому, что тесты построены на объектно-ориентированной среде, такой как PHPUnit, не означает, что они могут тестировать только ОО-код. У меня много процедурных кодов моих плагинов, и я тестирую их точно так же. WordPress также тестирует множество процедурного кода. Так что должно быть никаких проблем.
JD

Спасибо @JD. В идеале я бы тоже хотел написать свои тесты таким образом. Но я подчинюсь ООП, учитывая, что это не в основной кодовой строке. PS Я попытался оставить комментарий в вашем блоге и получил ошибку. косоглазое лицо Независимо от того, спасибо за 411.
Джош Хабдас

1
@JoshH Спасибо за внимание к проблеме с комментариями, это должно быть исправлено сейчас. Это было вызвано чрезмерно усердным плагином для защиты от спама.
JD

2

Исходный код на

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

кажется, лучшее место, чтобы посмотреть на данный момент


2
Просто удалите ссылку из вашего вопроса: что бы вы прочитали, чем? Пожалуйста, всегда пишите ответы, которые не зависят от внешних источников. В противном случае нам нужно удалить ваш ответ.
Кайзер

2
@ Кайзер, я вижу, откуда ты, но ответом на мой вопрос будет ссылка. Конечно, вы не ожидаете, что кто-то разместит всю документацию здесь?
djb

2
Да, мы ожидаем, что кто-то разместит здесь весь соответствующий код. Это даже записано в разделе часто задаваемых вопросов сайта: «Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно отключен». Это может быть не весь контент связанного ресурса, но в этом случае это может быть. То есть, когда этот ресурс GitHub становится недоступным, этот ответ становится бессмысленным.
s_ha_dum
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.