PHPUnit 我需要拆除 'require_once' 调用,因为它覆盖了一个仅用于测试的辅助函数

PHPUnit I need to tear down the 'require_once' call as it is overriding a helper function only for the test

我在帮助文件中创建了一个包装函数来包装全局使用的方法,例如 getTimestamp()。帮助文件与我正在测试的文件 ('The model file') 放在同一个命名空间中,一个类似于 'Project\Models\TeamName' 的命名空间。假设的模型文件使用 getTimestamp() 函数并进行计算以检查出生年份。我想在计算中测试边缘情况,所以我在帮助文件中将 'getTimestamp()' 函数覆盖为始终 return 125。

但是,这会导致 其他使用 getTimpestamp() 的 phpunit 测试 失败。我怎样才能把它拆下来,这样 'require_once' 和我的帮助文件就被撤消了,所以剩下的 phpunit 测试就通过了? phpunit test class 和 SUT 位于遥远的命名空间中。

现在我有一个 PHPUnit class(位于 Project\Testing\PHPUnit\Models\TeamName)

namespace Project\Testing\PHPUnit\Models\TeamName;
require_once '/testing/phpunit/models/teamname/testHelper.php';

use Project\Models\TeamName\MyModel

class MyModelTest {
    const correctAge = 75; 

    public function testAge(){
        $model = new MyModel(); 
        $result = $model -> calculateAgeFromBirthYear(50);
        assertEquals(self::correctAge, $result); 
    }
}

和辅助文件(位于 Project\Testing\PHPUnit\Models\TeamName)

namespace Project\Models\TeamName; 
function getTimestamp(){
    //today is year 125
    return 125; 
}

和SUT/model(位于Project\Models\TeamName)

namespace Project\Models\TeamName; 
class MyModel {
    function calculateAgeFromBirthYear($birthYear){
        $date = new DateTime();
        $today = $date->getTimestamp(); 
        return $today - $birthYear;
    }
}

我不希望其他 phpunit classes 继承一个总是 returns 125 的 getTimestamp(),我想撤消 requires_once

所以这对我的情况有效,不一定适用于所有情况。

在 MyModel class 中,我放置了一个名为 "getTimestampWrapper" 的函数,然后它调用了 "getTimestamp" 并且什么都不做。我的 calculateAgeFromBirthYear 函数现在看起来像这样:

namespace Project\Models\TeamName; 
class MyModel {
    function calculateAgeFromBirthYear($birthYear){
        $today = getTimestampWrapper(); 
        return $today - $birthYear;
    }
    function getTimestampWrapper(){
        $date = new DateTime();
        $todayWrapper = $date->getTimestamp(); 
        return $todayWrapper;
    }
}

在 MyModelTest 中,我模拟了 MyModel 对象,然后使用 onConsecutiveCalls 以正确期待结果。

  //make sure a function called 'getTimestampWrapper' is in your model
  $model = $this->getMockBuilder(MyModel::class)
      ->setMethods('getTimestampWrapper')
      ->getMock();

  //my onConsecutiveCalls will get me the fake timestamps I want
  $model  ->method('getTimestampWrapper')
      ->will(
          $this->onConsecutiveCalls(...[125, 125, 100])
      );
  //run your assertEquals now

所以现在当我在我的单元测试中调用 $model->calculateAgeFromBirthYear(50) 时,它会调用 use 125, 125, 100 作为时间戳