Издевательствование вызова с помощью цепочечных методов и аргументов

Я изучаю, как использовать насмешку, чтобы запустить какой-то модульный тест, и я не уверен, что делать, чтобы издеваться над моим классом базы данных. Он состоит из отдельных методов, которые могут быть соединены цепью, как эти два примера:

$db->select('someTblName',['fieldName']) ->where('fieldName', 'someValue') ->runQuery() ->fetch(); //returns array or null 

Другое использование может быть следующим:

 $db->select('someTblName') ->where('fieldName', 'someValue') ->where('fieldName', array('>=' , 'someValue') ->runQuery() ->fetch(); //returns array or null 

Из чтения некоторых документов я вижу, что могу сделать что-то вроде: (для первого случая)

 $db = \Mockery::mock('Database'); $db->shouldReceive('select', 'where', 'runQuery', 'fetcth') ->with(??????) ->andReturn(null); 

Теперь мне интересно, как передать «соответствующие параметры» методам? И как бы я высмеивал второй сценарий.

Вы можете сделать shouldReceive('select->where->runQuery->fetch') если вам не shouldReceive('select->where->runQuery->fetch') аргументы. Если вы хотите проверить аргументы, вы должны сделать следующее, чтобы оживить ожидания:

 $db->shouldReceive('select')->with('someTblName', ['fieldName']) ->once()->andReturn(m::self())->getMock() ->shouldReceive('where')... 

Последним должен был бы быть shouldReceive('fetch')->andReturn(null) .

Если вы довольны синтаксисом, подобным этому

 $db = m::stub('Database', array( 'select(someTblName)->where(fieldName,someValue)->runQuery->fetch' => 'return stuff', 'select(someOtherTblName)->where(...)->runQuery->fetch' => 'return other stuff' 

));

вы можете использовать небольшой помощник / расширение Mockery, который я только что написал

https://github.com/elvisciotti/mockery-stub-chain-args

альфа-версия, я, вероятно, скоро это сделаю