. # 39, & # 39 mock& 알 수 없는 경우. 지금 말을해야합니다.
어쨌든 내가 가지고 있는 상속됨 코드베이스 I& # 39 m, 쓸 수 있는 몇 가지 테스트를 위한 시간-기반. , 할 수 없는 코드는 역사 관련 항목을 보면 너무 애매한 경우 해당 항목 및 결정에 따라 이제는 시간 임계값입니다.
난 또 어느 시점에서 필요한 추가 확인 할 수 있는 것이 바로 테스트하려면 역사와 하한계는 이제 변경된 (그리고, 분명히, 올바른).
이 문제는 I& # 39, m 은 m 테스트 코드를 사용하고, 물론 그 부분을 I& # 39 에 통화 시간 () 등 정보기술 (it), m 찾기 위해 정말 열심히 임계값은 I& # 39 시간은 정확히 파악할 수 있다는 사실을 근거로 I& # 39 m, 시간 () 함수를 호출할 때 아니고 정확히 잘 진행되고 있다.
그래서 내 질문은 기본적으로 이: # 39, & # 39 는 나에게 override& 방법이 없을까. # 39, & # 39 시간 () 또는, out& 조룽 호출하십시오 짐작이지만요. & # 39 의 테스트를 진행하고 있으며, 같은 시간, 내 http://upload. time& # 39,?
아니면 그냥 사실을 받아들일 수 없는 I& # 39 m, 코드에서 # 39 m, 그 일을 할 것입니다 I& 테스트, 어떻게든 강제로 사용하도록 이를 허용하지 특정 시간 필요하다면?
어느 쪽이든, # 39, & # 39, 일반적인 practices& 있습니까 이 시간에 민감한 기능 개발을 위한 테스트 친화적임?
편집: 내 문제 역시 일부가 점도 영향을 줄 수 있는 시간을 셨으며 수행됨 역사상 임계값입니다. 예를 들어 here& # 39 의 일부를 내 문제가 아니다.
이러한 모든 규칙에 따라 역사적 타이밍. 난 내가 Dominik& # 39 의 테스트 제안에 동의한다 사용할 수 있습니다, 하지만 내 몇 초 안에 어떤 역사적 데이터? # 39, & # 39 그냥 create& 한다. 그 즉석에서?
알 수 있듯이, 못할 수도 I& # 39, & # 39 m, 이 모든 얻기 위해 아직도 노력하고 멈춤으로 testing& # 39. 개념;)
필자는 최근 뜨는 좋다 다른 솔루션과 함께 사용하는 경우 네임스페이스을 PHP 5.3. 현재 네임스페이스이며 시간 내에 새로운 구현할 수 있습니다 () 함수를 만들 수 있는 공유 자원 반환 값을 설정할 수 있는 테스트. 그 다음 모든 고객의 새로운 기능을 사용할 수 없는 호출하십시오 시간 ().
제가 자세한 판독값 설명됨 상세히 그것을 내 < " " > blog< /a>;;;;; a href = https://www.schmengler-se.de/en/2011/03/php-mocking-built-in-functions-like-time-in-unit-tests/
난 이미 특정 요청임을 시뮬레이션하려면 향후, 과거 날짜까지 앱 자체 (not in 유닛 테스트). (안) 에 대한 모든 호출을 업그레이드됨 \DateTime::now 반품해야 날짜 이전에 내내 설정되었습니다 app.
난 내가 할 수 있기 때문에 날짜를 조룽 변경하지 않고 적극 나서기로 했다 (https://github.com/rezzza/TimeTraveler) 이 라이브러리를 사용하여 모든 코드.
\Rezzza\TimeTraveler::enable();
\Rezzza\TimeTraveler::moveTo('2011-06-10 11:00:00');
var_dump(new \DateTime()); // 2011-06-10 11:00:00
var_dump(new \DateTime('+2 hours')); // 2011-06-10 13:00:00
대부분의 경우 이 그럼세 몇 가지 이점이 있다.
private function assertTimeEquals($testedTime, $shouldBeTime, $timeTolerance = 2)
{
$toleranceRange = range($shouldBeTime, $shouldBeTime+$timeTolerance);
return $this->assertContains($testedTime, $toleranceRange);
}
public function testGetLastLogDateInSecondsAgo()
{
// given
$date = new DateTime();
$date->modify('-189 seconds');
// when
$this->setLastLogDate($date);
// then
$this->assertTimeEquals(189, $this->userData->getLastLogDateInSecondsAgo());
}
아서르티미퀄스 있는지 () 는 다양한 (189, 190, 191) 에 189.
이 테스트는 테스트 기능을 실행하는 데 대한 올바른 apc® 전달될 경우 2 초 넘지 기능을 한다.
[룬킷] [1] 사용하여 확장명은:
define('MOCK_DATE', '2014-01-08');
define('MOCK_TIME', '17:30:00');
define('MOCK_DATETIME', MOCK_DATE.' '.MOCK_TIME);
private function mockDate()
{
runkit_function_rename('date', 'date_real');
runkit_function_add('date','$format="Y-m-d H:i:s", $timestamp=NULL', '$ts = $timestamp ? $timestamp : strtotime(MOCK_DATETIME); return date_real($format, $ts);');
}
private function unmockDate()
{
runkit_function_remove('date');
runkit_function_rename('date_real', 'date');
}
이렇게 조룽 테스트하려면 수도 있습니다.
public function testMockDate()
{
$this->mockDate();
$this->assertEquals(MOCK_DATE, date('Y-m-d'));
$this->assertEquals(MOCK_TIME, date('H:i:s'));
$this->assertEquals(MOCK_DATETIME, date());
$this->unmockDate();
}
function timeOverrides($namespaces = array()) {
$returnTime = time();
foreach ($namespaces as $namespace) {
eval("namespace $namespace; function time() { return $returnTime; }");
}
}
그럼 통과 '타임오버리데스 (어레이입니다 (.))' 를 설치 테스트 테스트 추적할 수 있도록 하나만 내 뭐한테 네임스페이스을 시간 () 는 '라.
가장 단순한 솔루션 약간만이라도 무시하려면 PHP 시간 () 함수를 호출하고 바꾸시겠습니까 자신의 이름으로 버전. 그러나 php 기능ᆞ기술과 내장현 쉽게 바꿀 수 없습니다 (<, a href = ", http://no.php.net/manual/en/function.override-function.php, 지켜보리니 /a> here< > ";;).
그 짧은 시간 () 의 유일한 방법은 추상 클래스 / 함수 호출이 자신만의 시간을 테스트를 위한 것이라고 일부 반품하십시오 합니다.
시스템 가상 머신 테스트를 재실행합니다 수도 있습니다 (운영 체제) 의 시간 및 변경하십시오 전체 가상 넓혀드립니다.