phpspec - утверждает, что объект изменился во время вызова метода

если у меня есть следующий метод:

function changeObject($object) {
    $object = new \stdClass();
}

Это очень глупый пример, но он используется для иллюстрации моего вопроса.

Передаваемый объект может быть изменен во время вызова метода, но метод не возвращает объект.

используя phpspec, как я могу утверждать, что объект был изменен?


person Marty Wallace    schedule 26.02.2014    source источник


Ответы (2)


К счастью, это непросто ни в PhpSpec, ни в любой другой среде тестирования. Объекты передаются по ссылке в PHP. Если вы измените ссылку, у вас больше не будет объекта, с которым вы могли бы сравнить. Вам придется скопировать исходный объект и сравнить его на основе его свойств. Не хорошая идея.

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

Ваш пример не очень хорошо описывает вашу проблему. Если бы вы дали лучший, мы могли бы предоставить лучшую помощь.

Если вы хотите только убедиться, что метод был вызван для объекта (в отличие от изменения ссылки из вашего примера), используйте mocks.

person Jakub Zalas    schedule 26.02.2014

Я не знаю, есть ли эффективный способ сделать это без насмешек. Ознакомьтесь с Phake.

Phake — это фиктивный фреймворк, который позволяет вам имитировать объекты в ваших тестах и ​​проверять, вызывают ли они определенные методы, или заставлять их возвращать определенные выходные данные в ваших тестах.

person STLMikey    schedule 26.02.2014
comment
Насмешка вам не поможет, так как нет вызова метода. - person Jakub Zalas; 07.03.2014