2

私はPHPUnitを使用した単体テストから始めたばかりで、その感触をつかむためにいくつかの簡単な方法で遊んでいます。一例はすぐに不可解です:

function setDelay($seconds)
{
    if($seconds == 0)
    {
        $this->delay = 0;
    }
    else
    {
        $this->delay = time() + $seconds;
    }
}

メソッドの外部でtime()が不明な場合、正しい期待される結果をどのように判断しますか?:

public function testSetDelayNonZero() {
  $expected = [??];
  $this->class->setDelay(100);
  $actual = $this->class->delay;
  $this->assertEquals($expected, $actual);
}
4

2 に答える 2

2

時間依存コードを別のクラスに抽出するのが最良のオプションです。

ただし、少しやり過ぎに見えることもあります。他の言語では、時間をグローバルに設定できます。たとえば、JavaではDateTimeUtils.setCurrentMillisFixed、 rubyではデロリアンです。

PHPでは、DateTimeの代わりに使用する必要があります(例:ouzo goodiesのClock )

次に、コードを使用します。

$time = Clock::now();

あなたのテストでは:

//given
Clock::freeze('2011-01-02 12:34');

//when
$result = YourCode::doSomethingWithTimeReturnedByClockNow();

//then
$this->assertEquals('2011-01-02', $result);
于 2015-01-07T18:34:26.473 に答える
1

基本的に、サンプルに基づいていくつかの小さな課題を設定して、期待どおりに機能をテストする必要があります。最初の簡単なテストは、コードに0秒を送信するときです。このテストは、次のように簡単な場合があります。

public function test_setDelay()
{
    this->assertEquals(0, setDelay(0));
}

時間が適切に進んだことをテストするには、オブジェクトをモックして、遅延が常に設定された時間と秒を返すようにするか、依存性注入を使用して時間を関数/クラスに渡して、オブジェクトを設定できるようにします。 、次に電話をかけて、返された時間が予想と一致することを確認します。

public function test_setDelay()
{
    this->assertEquals(0, setDelay(0));

    $setDelayMock = $this->getMock('DelayClass');
    $setDelayMock->method('setDelay')
        ->with($this->equalTo(5))
        ->will($this->returnValue('10:00:05'));
    $this->assertEquals('10:00:05', $setDelayMock->setDelay(5))
}

これは実際にはsetDelayをテストしませんが、その後に何をするかをテストするのに役立ちます。依存性注入は、クラスに時間を送信するために探しているものである可能性が高く、存在しない場合は、time()関数を使用します。このように、setDelayを呼び出そうとしているコードでtime()を使用してクラスに渡すか、クラスが欠落している場合は実行時にクラスが作成できるようにします。ただし、テストする場合は、time()ではなく、常に既知の値に時間を設定します。

$currentTime = DateTime::createfromformat('hms', '100000');    
于 2012-11-22T19:12:11.567 に答える