由于在我们代码开发中,网网接口调用平凡,但是现实资源往往也不足,为此,在我们的测试过程中也出现了困难,一方面是时间的对等,另一方面来自于开发进度和先关准备资源的不充分,为此,phpunit库早已为我们准备好了,getMock函数来跳过或者模拟一些接口方法:
以下假设update函数是掉外网的一个接口,但是这个时候,外网的接口还没有写好,我们怎么办才好呢?那就getMock吧!
helloworld.php
自动生成helloworldTest.php
<?php
require_once 'helloworld.php';
require_once 'PHPUnit/Framework/TestCase.php';
/**
* helloworld test case.
*/
class helloworldTest extends PHPUnit_Framework_TestCase {
/**
* @var helloworld
*/
private $helloworld;
/**
* Prepares the environment before running a test.
*/
protected function setUp() {
parent::setUp ();
// TODO Auto-generated helloworldTest::setUp()
$this->helloworld = new helloworld(/* parameters */);
}
/**
* Cleans up the environment after running a test.
*/
protected function tearDown() {
// TODO Auto-generated helloworldTest::tearDown()
$this->helloworld = null;
parent::tearDown ();
}
/**
* Constructs the test case.
*/
public function __construct() {
// TODO Auto-generated constructor
}
/**
* Tests helloworld->helloworld()
*/
public function testHelloworld() {
// TODO Auto-generated helloworldTest->testHelloworld()
//$this->markTestIncomplete ( "helloworld test not implemented" );
//$this->helloworld->helloworld(/* parameters */);
$this->assertTrue($this->helloworld->update('foo')=='foo'); ////假如接口真实存在直接可以调用,来什么返回什么
$this->assertFalse($this->helloworld->update('foo')=='foos');
//以下开始构造虚拟接口class helloworld function update('foo') return foos;
$observer = $this->getMock('helloworld', array('update'));
// 设定update()方法的期望值为只被以字符串“something”为参数调用一次。
$observer->expects($this->any())
->method('update')
->with($this->equalTo('foo'))
->will($this->returnValue('foos'));
// 创建一个Subject对象并附上模拟的Observer对象。
$this->assertTrue($observer->update('foo')=='foos');//虚拟接口变为:输入foo返回foos了
$result = $observer->update('foo');//虚拟接口变为:输入foo返回foos了
$this->assertTrue($this->helloworld->update_next_do($result)=="foos");//其余真实方法去调用(虚拟接口)以达到预期结果
}
}
注意:在里面多次执行了getMock模拟函数update(),我们用了any(),如果我们用once()的话,在调用第二次这个虚拟函数肯定会出错,因为once()限定了,相关匹配如下:
表 11.1. 匹配器
匹配器 含义
PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount any() 返回一个匹配器,当它评估的方法被执行0或多次时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedCount never() 返回一个匹配器,当它评估的方法被从未被执行时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce atLeastOnce() 返回一个匹配器,当它评估的方法被至少执行一次时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedCount once() 返回一个匹配器,当它评估的方法恰好被执行一次时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedCount exactly(int $count) 返回一个匹配器,当它评估的方法正好被执行$count次时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex at(int $index) 返回一个匹配器,当它评估的方法在特定的$index上被调用时匹配。
关于:
->with($this->equalTo('foo'))
->will($this->returnValue('foos'));
你要是传入多个变量的参数如(这样传):
->with($this->equalTo('foo'),$this->equalTo('foo2'),$this->equalTo(array("one","two","three")))
->will($this->returnValue(array("one return array","two return array","three return array")));
这儿的with参数和will关系:
只有传入with的几个对应的参数,方能得到will的结果,但是你要是有引用什么的函数需要Mock的话:
为此:在需要通过mock的函数,请不要写为引用的格式,通过return 返回即可。
但你会说,要是有错误怎么办?
我建议通过php5的try catch 来实现,定义错误编号来解决这个问题,Tks.转帖请注明来自向东的博客:www.xiangdong.org/blog
rewrite:xiangdong2
2009-4-13
以下假设update函数是掉外网的一个接口,但是这个时候,外网的接口还没有写好,我们怎么办才好呢?那就getMock吧!
helloworld.php
<?php
class helloworld
{
public function helloworld()
{
echo "hello the world!";
}
public function update($arra)
{
return $arra;
}
public function update_next_do($arra)
{
if($this->update($arra)=='foos')
{
return foos;
}else{
return false;
}
}
}
?>
class helloworld
{
public function helloworld()
{
echo "hello the world!";
}
public function update($arra)
{
return $arra;
}
public function update_next_do($arra)
{
if($this->update($arra)=='foos')
{
return foos;
}else{
return false;
}
}
}
?>
自动生成helloworldTest.php
<?php
require_once 'helloworld.php';
require_once 'PHPUnit/Framework/TestCase.php';
/**
* helloworld test case.
*/
class helloworldTest extends PHPUnit_Framework_TestCase {
/**
* @var helloworld
*/
private $helloworld;
/**
* Prepares the environment before running a test.
*/
protected function setUp() {
parent::setUp ();
// TODO Auto-generated helloworldTest::setUp()
$this->helloworld = new helloworld(/* parameters */);
}
/**
* Cleans up the environment after running a test.
*/
protected function tearDown() {
// TODO Auto-generated helloworldTest::tearDown()
$this->helloworld = null;
parent::tearDown ();
}
/**
* Constructs the test case.
*/
public function __construct() {
// TODO Auto-generated constructor
}
/**
* Tests helloworld->helloworld()
*/
public function testHelloworld() {
// TODO Auto-generated helloworldTest->testHelloworld()
//$this->markTestIncomplete ( "helloworld test not implemented" );
//$this->helloworld->helloworld(/* parameters */);
$this->assertTrue($this->helloworld->update('foo')=='foo'); ////假如接口真实存在直接可以调用,来什么返回什么
$this->assertFalse($this->helloworld->update('foo')=='foos');
//以下开始构造虚拟接口class helloworld function update('foo') return foos;
$observer = $this->getMock('helloworld', array('update'));
// 设定update()方法的期望值为只被以字符串“something”为参数调用一次。
$observer->expects($this->any())
->method('update')
->with($this->equalTo('foo'))
->will($this->returnValue('foos'));
// 创建一个Subject对象并附上模拟的Observer对象。
$this->assertTrue($observer->update('foo')=='foos');//虚拟接口变为:输入foo返回foos了
$result = $observer->update('foo');//虚拟接口变为:输入foo返回foos了
$this->assertTrue($this->helloworld->update_next_do($result)=="foos");//其余真实方法去调用(虚拟接口)以达到预期结果
}
}
注意:在里面多次执行了getMock模拟函数update(),我们用了any(),如果我们用once()的话,在调用第二次这个虚拟函数肯定会出错,因为once()限定了,相关匹配如下:
表 11.1. 匹配器
匹配器 含义
PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount any() 返回一个匹配器,当它评估的方法被执行0或多次时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedCount never() 返回一个匹配器,当它评估的方法被从未被执行时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce atLeastOnce() 返回一个匹配器,当它评估的方法被至少执行一次时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedCount once() 返回一个匹配器,当它评估的方法恰好被执行一次时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedCount exactly(int $count) 返回一个匹配器,当它评估的方法正好被执行$count次时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex at(int $index) 返回一个匹配器,当它评估的方法在特定的$index上被调用时匹配。
关于:
->with($this->equalTo('foo'))
->will($this->returnValue('foos'));
你要是传入多个变量的参数如(这样传):
->with($this->equalTo('foo'),$this->equalTo('foo2'),$this->equalTo(array("one","two","three")))
->will($this->returnValue(array("one return array","two return array","three return array")));
这儿的with参数和will关系:
只有传入with的几个对应的参数,方能得到will的结果,但是你要是有引用什么的函数需要Mock的话:
$friendObj = new Friend();
$friendObj->getList($fuids,$uid,0,1,1000);
var_dump($fuids); //你mock它,但是你传入的$fuids(假如一个数组),运行这儿是得不到的,注意啊!
if(empty($fuids['uids']))
{
return 0;
}
$friendObj->getList($fuids,$uid,0,1,1000);
var_dump($fuids); //你mock它,但是你传入的$fuids(假如一个数组),运行这儿是得不到的,注意啊!
if(empty($fuids['uids']))
{
return 0;
}
为此:在需要通过mock的函数,请不要写为引用的格式,通过return 返回即可。
但你会说,要是有错误怎么办?
我建议通过php5的try catch 来实现,定义错误编号来解决这个问题,Tks.转帖请注明来自向东的博客:www.xiangdong.org/blog
rewrite:xiangdong2
2009-4-13
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1305/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2009-4-13 18:23
评论列表