PHPUnit如何mock函数内部实例化的对象

m718281962 2014-06-18 06:49:37

class cash{
public function __construct(){}
public function isCashed(){
//do something
return 1;
}
}

class sendMsg{
public function send(){
$cash = new cash();
$isCashed = $cash->isCashed();
return $isCashed;
//do something
}
}

我想要对上面的sendMsg进行测试的时候 请问怎样mock出cash类然后注入到sendMsg当中


class sendMsgTest extension PHPUnit_Framework_TestCase{

public function testSend(){
$sendMsg = new sendMsg();

//如何mock一个cash
}
}

...全文
247 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
m718281962 2014-08-06
  • 打赏
  • 举报
回复
在《修改代码的艺术》一书中找到了答案:

class sendMsg{
    protected function cash(){
         return new cash()
    }
    public function send(){
          $cash = $this->cash();
          $isCashed = $cash->isCashed();
          return $isCashed;
         //do something
    }
}
//将外部依赖抽离到单独的函数 然后测试的时候创建一个子类
class sendMsgExt extend sendMsg{
        protected $cash;
        public function setCash($cash){
                return $this->cash = $cash;
        }
        protected function cash(){
            return $this->cash;
        }
}
//测试的时候 实例化子类并通过setCash将mock出来的cash注入进来
class sendMsgTest extension PHPUnit_Framework_TestCase{
       
       public function testSend(){
             $sendMsg = new sendMsgExt();
             $mockCash = $this->mock('cash');
             $mockCash->expects($this->any())->method("isCashed")->will($this->returnValue(1));
              $sendMsg->setCash($mockCash);
              $this->assertEquals(1,$sendMsg->send());
      }
}
碼上道 2014-06-19
  • 打赏
  • 举报
回复
可以试试phpunit phpmock
m718281962 2014-06-19
  • 打赏
  • 举报
回复
引用 1 楼 jerry_dqh 的回复:
class cash 这个已经定义好了吗,还是没有定义?
都已经定义好了,是对现有代码写测试,上面那个只是我简化了的个东西
碼上道 2014-06-18
  • 打赏
  • 举报
回复
class cash 这个已经定义好了吗,还是没有定义?

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧