使用cakephp和phpunit测试add方法

时间:2012-09-26 13:10:38

标签: php cakephp phpunit

我正在测试用cake制作的应用程序,我在测试add方法时发现了一个问题。问题实际上是每当我想在数据库上测试保存数据时,在使用请求发送样本数据之后,我发现该数据保存在数据库中,但只设置了id属性。其他字段为空。

以下是我要测试的方法:

public function admin_add() {
    if ($this->request->is('post')) {
        debug($this->request->data);
        $this->Item->create();
        if ($this->Item->save($this->request->data)) {
            $this->Session->setFlash(__('The item has been saved'));
            //$this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The item could not be saved. Please, try again.'));
        }
    }
    $products = $this->Item->Product->find('list');
    $attributes = $this->Item->Attribute->find('list');
    $this->set(compact('products', 'attributes'));
}

这是我的测试:

public function testAdmin_add(){

 $this->Items->request->params['action'] = 'admin_add';
 $this->Items->request->params['url']['url'] = 'admin/items/add';
 $data = array(
  'Item' => array(
    'product_id' => 1,
    'attribute_id' => 9,
    'title' => 'test_item',
    'code' => 1,
    'in_stock' => 1,
    'batched_stock'=> 1,
    'allocated' => 0,
  ),
 );

    $this->Collection = $this->getMock('ComponentCollection');
  $this->Items->Session = $this->getMock('SessionComponent', array('setFlash'), array($this->Collection));

  $this->Items->Session->expects($this->once())
        ->method('setFlash')
        ->with(__d('items', 'Se ha guardado el item'));


 $this->__setPost($data);

 $this->Items->admin_add();

}

请注意,如果我运行此测试,我将在db上有一个额外的字段,并且因为table的id是自动递增的,所以我无法获取id以删除该条目。
现在的问题是:有没有什么方法可以测试数据库保存而不实际保存数据?

谢谢!

1 个答案:

答案 0 :(得分:0)

为防止保存数据,您需要使用灯具。以下是基于您正在使用的CakePHP版本的文档:

确保使用测试数据库,否则您会发现每次测试运行后,您的表都将被删除。