在最新版本中,WP_UnitTestCase已包含$factory属性。

例如:

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


在哪里可以找到有关此有用功能的文档?

#1 楼

据我所知,目前没有任何文档。官方资源在这里。

我还编写了有关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 ) );


另外,如果您不仅需要您正在创建的对象的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工厂,但对于所有工厂来说都是一样。
br />

我想我会在WordPress文档小组中提及这一点。也许我们可以把这些东西放到插件和主题手册中。

更新(2015年6月20日):您还可以创建自己的自定义工厂!

更新(9月27日) ,2016年):在WordPress 4.4中,对测试进行了更新,以提供用于访问工厂的静态factory()方法,尽管仍然通过魔术获取器提供了factory属性。

评论


域已失效,本教程的链接也已失效。它被移动了吗?

–乔什·哈布达斯(Josh Habdas)
17年5月16日在2:58

@JoshH它似乎现在正在备份。您可能在站点在深夜(我的时区)运行备份时命中了它。

– J.D.
17年5月16日在11:19

@JoshH我不知道任何使用过程代码进行测试的单元测试框架。我真的怀疑过程测试框架是否会和OO一样好用,仅仅是因为它需要如何工作。但是,仅仅因为测试建立在像PHPUnit这样的面向对象的框架上,并不意味着它们只能测试OO代码。我的插件有很多程序代码,并以完全相同的方式对其进行测试。 WordPress还以这种方式测试了很多程序代码。所以应该没问题。

– J.D.
17年5月17日在11:29

谢谢@ J.D。理想情况下,我也想以这种方式编写测试。但是我会向OOP提交,因为它不在主要代码行中。附言我尝试在您的博客上提交评论,但收到一个错误。不管怎样,感谢411。

–乔什·哈布达斯(Josh Habdas)
17年5月17日在11:33

@JoshH感谢您对有关问题的评论,现在应该解决此问题。这是由过度的反垃圾邮件插件引起的。

– J.D.
17年5月17日在12:16

#2 楼



https://github.com/rnagle/wordpress-unit-tests/blob/master/includes/factory.php
的源代码似乎是最好的看的地方

评论


只需从您的问题中删除链接:您会读到什么?请始终写出不依赖外部资源的答案。否则,我们将需要删除您的答案。

– kaiser
2014年3月25日12:55

@kaiser,我知道您来自哪里,但对我的问题的答案将是链接。您肯定不会期望有人在此处发布整个文档吗?

– djb
2014年3月25日14:27在

是的,我们希望有人在这里发布所有相关代码。甚至将其写到站点FAQ中:“如果目标站点无法访问或永久脱机,请始终引用重要链接中最相关的部分。”那可能不是链接资源的全部内容,但在这种情况下可能是全部。照原样,当该GitHub资源变得不可访问时,此答案变得毫无意义。

– s_ha_dum
2014年3月25日16:26