2017-06-21 10 views
0

PHPの場合、同じクラスの別の関数searchDateOperator()$thisというキーワードを使用して別の関数を呼び出すことができます。これのためのユニットテストを書く方法?

public static function segmetDateRangeFilter($searchField, $startDate, $endDate, $dateRange) 
{ 
    $filter = []; 

    if ($startDate && !$endDate) { 
     $filter = [ 
      'range' => [ 
       $this->searchDateOperator($searchField) => [ 
        'gte' => strtotime($startDate), 
       ] 
      ] 
     ]; 
    } 

    if ($endDate && !$startDate) { 
     $filter = [ 
      'range' => [ 
       $this->searchDateOperator($searchField) => [ 
        'lte' => strtotime($endDate) 
       ] 
      ] 
     ]; 
    } 

    if ($startDate && $endDate) { 
     $filter = [ 
      'range' => [ 
       $this->searchDateOperator($searchField) => [ 
        'gte' => strtotime($startDate), 
        'lte' => strtotime($endDate) 
       ] 
      ] 
     ]; 
    } 

    if ($dateRange !== '') { 

     // $endTime upto current Time 
     $endTime = Carbon::now()->timestamp; 
     // Start Time . substract the date range days. and in timestamp 
     $startTime = Carbon::now()->subDays($dateRange)->timestamp; 

     $filter = [ 
      'range' => [ 
       $this->searchDateOperator($searchField) => [ 
        'gte' => $startTime, 
        'lte' => $endTime 
       ] 
      ] 
     ]; 
    } 

    if ($filter) { 
     return $filter; 
    } 
} 
+0

通常、 '$ searchField'、' $ startDate'、 '$ endDate'、' $ dateRange'の与えられたセットに対して実際に返された値が期待通りです。これを不可能にする何か他のものがありますか? – xmike

+0

これは関数searchDateOperatorが呼び出されてfuctionをテストする必要があります。テスト関数では、単にこの関数を呼び出してエラーをスローします。エラー:オブジェクトコンテキストにないときは$ thisを使用します。スコープ解決演算子を使った呼び出しはうまくいきます...問題は、$ thisを使って別の関数への参照を持つ関数を呼び出したいのです。 –

+0

ええ、 'segmetDateRangeFilter'が静的であるのを忘れました。これは 'searchDateOperator'を静的にする(そうでないと意味がない)。したがって、 '$ this-> searchDateOperator($ searchField)'を 'self :: searchDateOperator($ searchField)'に変更すればいいはずです。 – xmike

答えて

0

あなたの問題は、メソッドがstatic宣言されていますが、$thisを使用していることです。

また
$filter = [ 
    'range' => [ 
     self::searchDateOperator($searchField) => [ 
      'gte' => $startTime, 
      'lte' => $endTime 
     ] 
    ] 
]; 

あなたはsegmetDateRangeFilterから静的削除して、このようなテストでそれを使用することもできます:

public function testSomething() 
{ 
    $filterFactory = new DateFilterFactory(); 
    // ... 

    $result = $filterFactory->segmetDateRangeFilter(...); 

    // Assertions against result 
} 

呼び出しているメソッドが静的である場合だけでなく、あなたがこのような自己または静的を使用する必要がありますクラス名DateFilterFactoryは、あなたが使うもので置き換える必要があります。

関連する問題