Использование hasKeyValuePair от Hamcrest с модульным тестом laravel
У меня есть следующий тест:
public function testTestNameRequired(){
Validator::shouldReceive("make")->once()
->with(array(1,2,3), hasKeyValuePair("name",array("required")))
->andReturn(m::mock(["passes"=>true]));
$r = $this->vendorRepo->test(array(1,2,3));
assertThat($r,is(TRUE));
}
Когда я запускаю этот тест, я получаю следующую ошибку:
1) VendorRepoTest::testTestNameRequired
Mockery\Exception\NoMatchingExpectationException: No matching handler found for Illuminate\Validation\Factory::make(Array, Array). Either the method was unexpected or its arguments matched no expected argument list for this method
Hamcrest, очевидно, установлен, потому что тест не скулил, не зная, что hasKeyValuePair()
является. Но я думаю, что это не делает то, что я думаю, что должно. Я переписал его, чтобы использовать Hamcrest's anything()
метод как это:
public function _testTestFieldRequired($field){
Validator::shouldReceive("make")->once()
->with(array(1,2,3), anything()) //hasKeyValuePair($field,array("required")))
->andReturn(m::mock(["passes"=>true]));
$r = $this->vendorRepo->test(array(1,2,3));
assertThat($r,is(TRUE));
}
и я получаю ту же ошибку. Однако, используя Mockery::any()
работает:
public function _testTestFieldRequired($field){
Validator::shouldReceive("make")->once()
->with(array(1,2,3), Mockery::any()) //hasKeyValuePair($field,array("required")))
->andReturn(m::mock(["passes"=>true]));
$r = $this->vendorRepo->test(array(1,2,3));
assertThat($r,is(TRUE));
}
Я думаю, что у меня неправильно установлены Mockery или Hamcrest. Они не очень хорошо играют вместе. Вот мой composer.json:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"require": {
"laravel/framework": "4.0.*",
"way/generators": "dev-master",
"zurb/foundation": "v4.3.1",
"intervention/image": "dev-master",
"intervention/helper": "dev-master"
},
"require-dev": {
"mockery/mockery": "dev-master@dev",
"cordoval/hamcrest-php": "dev-master@dev",
"way/laravel-test-helpers": "dev-master",
"loic-sharma/profiler": "dev-master"
},
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php",
"app/OfficePilot"
],
"files": [
"vendor/cordoval/hamcrest-php/hamcrest/Hamcrest.php"
]
},
"scripts": {
"post-install-cmd": [
"php artisan optimize"
],
"pre-update-cmd": [
"php artisan clear-compiled"
],
"post-update-cmd": [
"php artisan optimize"
],
"post-create-project-cmd": [
"php artisan key:generate"
]
},
"config": {
"preferred-install": "dist"
},
"minimum-stability": "dev"
}
Есть идеи, что происходит?
2 ответа
У меня возникла та же проблема, похоже, что она изолирована от пакета cordoval/hamcrest-php.
Я перешел на пакет davedevelopment/hamcrest-php для разрешения.
Теперь хранилище официально перемещено на https://packagist.org/packages/hamcrest/hamcrest-php. Вы можете использовать v1.0.0 в качестве зависимости, чтобы быть совместимым с последней версией Mockery.
Существует PR https://github.com/padraic/mockery/pull/170 который обновляет код Mockery для совместимости с выпуском Hamcrest v1.1.0, который использует пространства имен вместо глобальных функций сопоставления.