当被存根的方法最初不存在时 PHPUnit 失败

PHPUnit Fail When Method Being Stubbed Does Not Originally Exist

如果被存根的方法最初不存在于被存根的 class 中,是否有办法让 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
    ...
  }
}

不,你不能。

PHPUnit 不需要 class 来模拟它。您甚至可以将模拟设置为不使用任何自动加载。发生这种情况时,PHPUnit 会即时创建一个伪造的 class。这个假 class 没有任何定义的方法会导致抛出异常,使您的测试套件失败。

由于正在测试的代码存在问题,您的测试应该会失败。模拟问题不在您的测试范围内。您的示例中的问题将在您的功能测试期间被发现。

确实没有一种简单的方法可以区分拼写错误的函数和尚未实现的函数。

@Schleis 是对的,您不能直接在 PHPUnit 中执行此操作。 但是从 PHPUnit 4.5 开始,您可以使用 Prophecy 创建测试替身。预言不会容忍这种行为。您将无法使用它模拟不存在的方法。