WordPress | ウィジェットの単体テストを行う

WordPress のウィジェットの単体テストを行う。

class-samplewidget.php

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
<?php
/**
* Sample Widget class
*
* Sample class file for make widget
*
* @category Widget
* @package sample-plugin
*/

/**
* Sample Widget
*/
class SampleWidget extends WP_Widget {
/**
* Constructor
*/
public function __construct() {
/*
* 情報用の設定値
*/
$widget_options = array(
'classname' => 'sample-widget',
'description' => '単体テスト用のサンプルウィジェットです。',
'customize_selective_refresh' => true,
);

/*
* 操作用の設定値
*/
$control_options = array(
'width' => 400,
'height' => 350,
);

/*
* 親クラスのコンストラクタに値を設定
*/
parent::__construct(
'sample-widget',
'サンプルウィジェット',
$widget_options,
$control_options
);
}

/**
* ウィジェットの内容をWebページに出力します(HTML表示)
*
* @param array $args register_sidebar()で設定したウィジェットの開始/終了タグ、タイトルの開始/終了タグなどが渡される.
* @param array $instance 管理画面から入力した値が渡される.
*/
public function widget( $args, $instance ) {
if ( isset( $args['before_widget'] ) && ( '' !== $args['before_widget'] ) ) {
echo esc_html( $args['before_widget'] );
}

if ( isset( $args['before_title'] ) && ( '' !== $args['before_title'] ) ) {
echo esc_html( $args['before_title'] );
}
echo esc_html( $instance['title'] );
if ( isset( $args['after_title'] ) && ( '' !== $args['before_title'] ) ) {
echo esc_html( $args['after_title'] );
}

echo '<span id="message">' . esc_html( $instance['message'] ) . '</span>';
if ( isset( $args['after_widget'] ) && ( '' !== $args['before_widget'] ) ) {
echo esc_html( $args['after_widget'] );
}
}

/**
* ウィジェットオプションのデータ検証/無害化
*
* @param array $new_instance 新しいオプション値.
* @param array $old_instance 以前のオプション値.
*
* @return array データ検証/無害化した値を返す
*/
public function update( $new_instance, $old_instance ) {
$instance = $old_instance;

if ( isset( $new_instance['message'] ) ) {
$instance['message'] = sanitize_text_field( $new_instance['message'] );
}
return $instance;
}
}

tests/test-sample.php

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
<?php
/**
* Class SampleTest
*
* @package Sample_Plugin
*/

/**
* Sample test case.
*/
class SampleTest extends WP_UnitTestCase {

public function test_widget_construct()
{
$widget = new SampleWidget();
$this->assertSame( 'sample-widget', $widget->id_base );
$this->assertSame( 'sample-widget', $widget->widget_options['classname'] );
$this->assertTrue( $widget->widget_options['customize_selective_refresh'] );
$this->assertSame( 400, $widget->control_options['width'] );
$this->assertSame( 350, $widget->control_options['height'] );
}

function test_widget_register() {
global $wp_widget_factory;

register_widget('SampleWidget');
$this->assertArrayHasKey( 'SampleWidget', $wp_widget_factory->widgets );

unregister_widget('SampleWidget');
$this->assertArrayNotHasKey( 'SampleWidget', $wp_widget_factory->widgets );
}

function test_widget_widget() {
register_widget('SampleWidget');

$this->expectOutputString('<div class="test widget sample-widget"><h2 class="test widget">Sample Widget</h2><span id="message">Hello, world</span></div>');

$instance = [
'count' => 1,
'dropdown' => 0,
'hierarchical' => 0,
'message' => 'Hello, world',
'title' => 'Sample Widget',
];

$args = [
'before_widget' => '<div class="test widget %1$s">',
'after_widget' => '</div>',
'before_title' => '<h2 class="test widget">',
'after_title' => '</h2>',
];

the_widget(
'SampleWidget',
$instance,
$args
);

unregister_widget('SampleWidget');
}

public function test_update()
{
$instance = [
'message' => 'Hello, world',
];
$expected = [
'message' => 'Hello, world',
];

$widget = new SampleWidget();
$result = $widget->update($instance, []);

$this->assertEquals($expected, $result);
}

/**
* @dataProvider provider_update_validate
*/
public function test_update_validate($message, $expectedMessage)
{
$instance = [
'message' => $message,
];
$expected = [
'message' => $expectedMessage,
];

$widget = new SampleWidget();
$result = $widget->update($instance, []);

$this->assertEquals($expected, $result);
}

public function provider_update_validate()
{
return [
'tag' => ['<alert>Hello, world</alert>', 'Hello, world'],
'>' => ['>Hello, world<', '>Hello, world&lt;'],
'tab' => ["Hello, world", 'Hello, world'],
'newline' => ["Hello,\nworld", 'Hello, world'],
];
}
}