加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Mockery和PHPUnit:此模拟对象上不存在方法

发布时间:2020-12-13 21:55:43 所属栏目:PHP教程 来源:网络整理
导读:你能告诉我问题出在哪里吗?我有一个文件GeneratorTest.php与以下测试: ?phpnamespace statsTest;use statsjwayFile;use statsjwayGenerator;class GeneratorTest extends PHPUnit_Framework_TestCase{ public function tearDown() { Mockery::close
你能告诉我问题出在哪里吗?我有一个文件GeneratorTest.php与以下测试:

<?php

namespace statsTest;

use statsjwayFile;
use statsjwayGenerator;

class GeneratorTest extends PHPUnit_Framework_TestCase
{

    public function tearDown() {
        Mockery::close();
    }

    public function testGeneratorFire()
    {
        $fileMock = Mockery::mock('statsjwayFile');
        $fileMock->shouldReceive('put')->with('foo.txt','foo bar')->once();
        $generator = new Generator($fileMock);
        $generator->fire();
    }

    public function testGeneratorDoesNotOverwriteFile()
    {
        $fileMock = Mockery::mock('statsjwayFile');
        $fileMock->shouldReceive('exists')
            ->once()
            ->andReturn(true);

        $fileMock->shouldReceive('put')->never();

        $generator = new Generator($fileMock);
        $generator->fire();
    }
}

这里是文件和生成器类:

File.php:

class File
{
    public function put($path,$content)
    {
        return file_put_contents($path,$content);
    }

    public function exists($file_path)
    {
        if (file_exists($file_path)) {
            return true;
        }
        return false;
    }
}

Generator.php:

class Generator
{
    protected $file;

    public function __construct(File $file)
    {
        $this->file = $file;
    }

    protected function getContent()
    {
        // simplified for demo
        return 'foo bar';
    }

    public function fire()
    {
        $content = $this->getContent();
        $file_path = 'foo.txt';

        if (! $this->file->exists($file_path)) {
            $this->file->put($file_path,$content);
        }
    }

}

因此,当我运行这些测试时,我收到以下消息:BadMethodCallException:Method … :: exists()在此模拟对象上不存在.

enter image description here

解决方法

错误消息对我来说似乎很清楚.您只设置了put方法的期望,但不存在.所有代码路径中的被测试类都调用exists方法.

public function testGeneratorFire()
{
    $fileMock = Mockery::mock('statsjwayFile');
    $fileMock->shouldReceive('put')->with('foo.txt','foo bar')->once();

    //Add the line below
    $fileMock->shouldReceive('exists')->once()->andReturn(false);

    $generator = new Generator($fileMock);
    $generator->fire();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读