Я изучаю, как использовать насмешку, чтобы запустить какой-то модульный тест, и я не уверен, что делать, чтобы издеваться над моим классом базы данных. Он состоит из отдельных методов, которые могут быть соединены цепью, как эти два примера:
$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
альфа-версия, я, вероятно, скоро это сделаю