Использование 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, который использует пространства имен вместо глобальных функций сопоставления.

Другие вопросы по тегам