为什么我的测试控制器中的 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
不会被填充,因为它会污染全局状态,而是直接将数据设置到请求对象。
见
我的 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
不会被填充,因为它会污染全局状态,而是直接将数据设置到请求对象。
见