0

给定一个看起来像这样的雄辩的回购。

 class PinRepo {
        protected $pinModel; 

        public function __construct( Model $pinModel )
        {
            $this->pinModel = $pinModel;
        }
        public function addPinToProject( $page_id, $inputs )
        {
            $pin = new $this->pinModel();
            $pin->fill($inputs);
            $pin->save();
            return $pin;
        }
    }

我的第一次尝试是:

class PinRepoTest extends TestCase {

    public function setUp()
    {
        parent::setUp();
        $this->modelMock = Mockery::mock( 'Pin' );
        $this->pinRepo = PinRepo( $this->modelMock );
    }

    public function testAddPinToPage() 
    {       
        $this->modelMock
            ->shouldReceive('fill')->with(["project_page_id"=>1])
            ->once()
            ->andReturn(Mockery::self())
            ->shouldReceive('save')
            ->once();
        $this->pinRepo->addPinToProject( 2, ["project_page_id"=>1]);
    }
}

但我得到了这个错误(哪种有意义)

“此模拟对象上不存在方法 ::fill()”

鉴于此设置,有什么方法可以让该测试通过?

4

1 回答 1

0

这是我想出的:

class modelStub extends Illuminate\Database\Eloquent\Model {

    static $methodCalls = [];

    public function fill(array $attributes)
    {
        self::$methodCalls['fill'] = TRUE;
        return $this;
    }
    public function save(array $options = array())
    {
        self::$methodCalls['save'] = TRUE;
        //dd($this);
        return $this;
    }

    public function __set($name, $value)
    {
        //dd($name, $value);
        static::$$name = $value;
        return $this;
    }
}


class pageModelStub extends modelStub {
    static $project_guid = false;
}

    public function testAddPageToProject()
    {
        $modelStub = new pageModelStub;
        $this->pageRepo = new \Nota\Repos\PageRepo( $modelStub );
        $this->pageRepo->addPageToProject('project_guid', ['fds']);
        $this->assertTrue( $modelStub::$methodCalls['fill'] );
        $this->assertTrue( $modelStub::$methodCalls['save'] );
        $this->assertEquals( $modelStub::$project_guid, "project_guid" );
    }

这看起来很老套,但至少我可以测试用这种方法对我来说什么是重要的。对此的任何改进都非常受欢迎。

于 2013-11-08T15:05:58.483 回答