为什么我的测试控制器中的 url 引用没有成功通过 if(isset)

Why does my url reference in my test controller don't pass succesfully trought the if(isset)

我的 ProduitsControllerTest 中的 testRapportParams 函数有问题。当我输入带有变量的 url 时,它通过 else 部分传递给控制器​​,这意味着未设置变量。问题是,在核心程序中,ProduitsController 运行良好。我不明白它在我的测试中不起作用。

这里是我的测试控制器的代码:

//in my ProduitsControllerTest
public function testRapportParams()
{
    //Test if the year in the url can be found  
    $dateCompare = array(Date('Y'), Date('Y')-1, Date('Y')-2, Date('Y')-3,Date('Y')-4,Date('Y')-5,Date('Y')-6,Date('Y')-7);
    $produits = TableRegistry::get('Produits');

    //The url called by this is : '/produits/rapport?datecompare=2015'
    $this->get('/produits/rapport?datecompare='.$datecompare[1]);
    $this->assertResponseOk();
    $produitsnouveau = $this->viewVariable('produitsnouveau');
    $produitssupp = $this->viewVariable('produitssupp');

    //$produits->find('all')->where(['YEAR(__creation_ts) = ' => $datecompare[1]])
    //                      ->where('supp_le_ts is NULL')
    //                      ->count() == 0

    //$produits->find('all')->where(['YEAR(supp_le_ts) = ' => $datecompare[1]])
    //                      ->count() == 2

    //count($produitsnouveau) == 0 (supposed to be 0)
    //count($produitssupp) == 1 (supposed to be 2)

    $this->assertEquals($produits->find('all')->where(['YEAR(__creation_ts) = ' => $datecompare[1]])->where('supp_le_ts is NULL')->count(),count($produitsnouveau));
    $this->assertEquals($produits->find('all')->where(['YEAR(supp_le_ts) = ' => $datecompare[1]])->count(),count($produitssupp));

}

这是我用来测试的函数:

 public function rapport()
 {
   $datecompare = array(Date('Y'), Date('Y')-1, Date('Y')-2, Date('Y')-3,Date('Y')-4,Date('Y')-5,Date('Y')-6,Date('Y')-7);
   $this->set('datecompare',$datecompare);

   //The url called is : '/produits/rapport?datecompare=2015'
   if(isset($_GET['datecompare']))
   {
       $this->paginate = [
           'conditions' => [
               'Produits.supp_le_ts IS NULL',
               'YEAR(Produits.__creation_ts) = ' => $_GET['datecompare'],
           ],
           'contain' => ['Items'],
           'order' => ['nom' => 'asc']
       ];
       $produitsnouveau = $this->paginate($this->Produits); 

       $this->paginate = [
           'conditions' => [
               'YEAR(Produits.supp_le_ts) = ' => $_GET['datecompare'],
         ],
         'contain' => ['Items'],
         'order' => ['nom' => 'asc']
       ];
       $produitssupp = $this->paginate($this->Produits);
       debug($produitssupp);
       die;
   }else{
     $this->paginate = [
         'conditions' => [
             'Produits.supp_le_ts IS NULL',
             'YEAR(Produits.__creation_ts) = ' => $datecompare[0],
         ],
         'contain' => ['Items'],
         'order' => ['nom' => 'asc']
     ];
     $produitsnouveau = $this->paginate($this->Produits);

     $this->paginate = [
         'conditions' => [
             'YEAR(Produits.supp_le_ts) = ' => $datecompare[0],
         ],
         'contain' => ['Items'],
         'order' => ['nom' => 'asc']
     ];
     $produitssupp = $this->paginate($this->Produits);
   }

     $this->set('produitsnouveau',$produitsnouveau);
     $this->set('produitssupp',$produitssupp);
     $this->set('_serialize', ['produits']);
 }

我想了解为什么它在我的测试中使用时总是在 else 部分通过,但当我在主应用程序中使用我的浏览器时它运行良好。

这样做是因为您没有使用正确的 CakePHP 技术来检索请求数据,即 \Cake\Network\Request 对象,特别是 Request::query(),例如

$datecompare = $this->request->query('datecompare');
if ($datecompare !== null) {
    // ...

集成测试用例只是模拟请求,它不会派发真实的请求,因此,$_GET不会被填充,因为它会污染全局状态,而是直接将数据设置到请求对象。