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 作为时间戳
我在帮助文件中创建了一个包装函数来包装全局使用的方法,例如 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 作为时间戳