Есть ли способ заставить PHPUnit генерировать исключение, если метод-заглушка изначально не существует в классе-заглушке?
Вот грубый пример:
class User {
function getId() { ... }
}
class LoginTest extends PHPUnit_Framework_TestCase {
function testLogin() {
...
$userMock = $this->getMockBuilder('User')
->setMethods(['getID']) // getId is misspelled; error should occur
->getMock();
...
}
}
class Login {
function login($user) {
...
$id = $user->getID(); // tests will pass even though this is misspelled
...
}
}
@Schleis прав, что вы не можете сделать это в PHPUnit напрямую.
Но с PHPUnit 4.5 вы можете использовать Prophecy для создания двойников теста. Пророчество не потерпит такого поведения. Вы не сможете издеваться над несуществующим методом.
Нет, ты не можешь.
PHPUnit не должен иметь класс, доступный, чтобы высмеивать его. И вы даже можете установить макет, чтобы не использовать автозагрузку. Когда это происходит, PHPUnit создает фальшивый класс на лету. В этом фальшивом классе нет определенных методов, которые могли бы вызвать исключение, если ваш набор тестов не прошел.
Ваши тесты должны провалиться из-за проблем с кодом, который тестируется. Проблемы с макетом выходят за рамки вашего теста. Проблема в вашем примере будет обнаружена во время функционального тестирования.
На самом деле не существует простого способа отличить функцию с ошибкой от функции, которая еще не была реализована.