一个类似 jmock Expectations 实现可以mock任何函数、对象方法的php扩展,可以与phpunit、xdebug配合使用。 解决php单元测试需要使用反射依赖注入的方式,增加代码复杂度,使用tmock可以在任何函数直接mock节点返回值,代码更加简洁可靠。
- PHP 7.0 +
$/path/to/phpize
$./configure --with-php-config=/path/to/php-config
$make && make install
tmock_start(array $array) : bool
<?php
tmock_start(['test' => function (){return 2;}]);
function test(){
return 3;
}
var_dump(test());
int(2)
tmock_get() : array
<?php
tmock_start(['test' => function (){return 2;}]);
var_dump(tmock_get());
array(1) {
["test"]=>
object(Closure)#2 (0) {
}
}
tmock_end() : bool
<?php
tmock_start(['test' => function (){return 2;}]);
function test(){
return 3;
}
var_dump(test());
tmock_end();
var_dump(test());
int(2)
int(3)
tmock_debug_start() : bool
<?php
tmock_debug_start();
tmock_start(['test' => function (){return 2;}]);
function test(){
return 3;
}
var_dump(test());
fname test, type 2
fname test match
fname test is_callable
fname test fcall init SUCCESS
fname test callable SUCCESS
fname var_dump, type 1
int(2)
tmock_debug_end() : bool
<?php
tmock_debug_start();
tmock_start(['test' => function (){return 2;}]);
function test(){
return 3;
}
var_dump(test());
tmock_debug_end();
var_dump(test());
fname test, type 2
fname test match
fname test is_callable
fname test fcall init SUCCESS
fname test callable SUCCESS
fname var_dump, type 1
int(2)
fname tmock_debug_end, type 1
int(2)
<?php
var_dump(tmock_start(['MyProject\test1'=>function (){return 1;}]));
function test1(){
return 2;
}
var_dump(test1());
var_dump(tmock_end());
var_dump(test1());
bool(true)
int(1)
bool(true)
int(2)
<?php
var_dump(tmock_start(['explode'=>function (){return 2;}]));
var_dump(explode(',','1,2'));
var_dump(tmock_end());
var_dump(explode(',','1,2'));
bool(true)
int(2)
bool(true)
array(2) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
}
<?php
var_dump(tmock_start(['obj1->test1'=>function (){return 2;}]));
class obj1 {
function test1() {
return 3;
}
}
var_dump((new obj1)->test1());
var_dump(tmock_end());
var_dump((new obj1)->test1());
bool(true)
int(2)
bool(true)
int(3)
<?php
var_dump(tmock_start(['obj2::test1'=>function (){return 2;}]));
class obj2 {
static function test1() {
return 3;
}
}
var_dump(obj2::test1());
var_dump(tmock_end());
var_dump(obj2::test1());
bool(true)
int(2)
bool(true)
int(3)
<?php
namespace MyProject;
var_dump(tmock_start(['MyProject\test1'=>function (){return 1;}]));
function test1(){
return 2;
}
var_dump(test1());
var_dump(tmock_end());
var_dump(test1());
bool(true)
int(1)
bool(true)
int(2)
tmock_start(['testClass->testMethod' => function ($fname, $args, $obj){
var_dump($fname, $args, $obj);
$args[0] = 3;
return 2;
}]);
class testClass
{
var $a1 = 5;
function testMethod(&$p1, $p2)
{
return 1;
}
}
var_dump((new testClass)->testMethod($a, $b));
var_dump($a);
string(21) "testClass->testMethod"
array(2) {
[0]=>
&NULL
[1]=>
NULL
}
object(testClass)#2 (1) {
["a1"]=>
int(5)
}
int(2)
int(3)