Как один модуль тестирует добавление строки в базу данных с помощью Zend Framework & PHPUnit? - PullRequest
0 голосов
/ 13 апреля 2009

Чтобы проверить вставку / обновление строки, я написал тест для имитации поста, проверки его перенаправления и проверки того, что вновь вставленный / обновленный текст находится на странице. Код работает, но не тестирует - можете ли вы сказать мне, почему это неправильно?

public function testEditProduct() {
    $request = $this->getRequest();
    $request->setMethod('POST');
    $request->setPost(array(
        'id'=>'1',
        'title'=>'Test Product 1a'
    ));
    $this->dispatch('/product/edit/id/1');
    $this->assertRedirectTo('/');
    $this->assertQueryContentContains('a', 'Test Product 1a');
}
public function testAddProduct() {
    $request = $this->getRequest();
    $request->setMethod('POST');
    $request->setPost(array(
        'title'=>'Test Product 3'
    ));
    $this->dispatch('/product/add/');
    $this->assertRedirectTo('/');
    $this->assertQueryContentContains('a', 'Test Product 3');
}

Следующие оба теста работают, утверждая, что страница индекса с параметром ID содержит соответствующий текст, и что после удаления продукта название продукта больше не отображается на странице.

public function testIndexPageListsProducts() {
    $this->dispatch('/product/index/id/1');
    $this->assertQueryContentContains('h1', 'Test Product 1');
}

public function testDeleteProduct() {
    $request = $this->getRequest();
    $request->setMethod('POST');
    $this->dispatch('/product/delete/id/2');
    $this->assertRedirectTo('/');
    $this->assertNotQueryContentContains('a', 'Test Product 2');
}

Ответы [ 2 ]

2 голосов
/ 14 апреля 2009

В первом тесте измените

$this->assertRedirectTo('/');
$this->assertQueryContentContains('a', 'Test Product 3');

до

$this->assertRedirectTo('/');

$this->resetRequest();
$this->resetResponse();

$this->disptach('/');
$this->assertQueryContentContains('a', 'Test Product 3');

Если я прав, среда модульного тестирования не выполняет перенаправления. Он отслеживает, какие перенаправления были запрошены, но фактически не делает их.

Итак, в своем коде вы проверяете наличие «Тестового продукта 3» в представлении / действии редактирования, и этот тест, конечно, не проходит. Сначала вы должны запросить индекс, а затем выполнить тест.

0 голосов
/ 16 апреля 2009

спасибо за вашу помощь. Я обнаружил, что $this->resetRequest(); и $this->resetResponse(); выдавали ошибки, но я проверил сводку по методу для Zend_Test_PHPUnit_ControllerTestCase и обнаружил $this->reset(); На связанной странице есть список упомянутых вами методов, но они перечислены по-другому. 1006 *

$this-reset(); сам по себе также выдавал ошибку (для этого приложения не определен модуль по умолчанию), но я обнаружил, что если после этого я вызову $this->bootstrap();, то испытания пройдут. Это правильное решение? Для пояснения мой тестовый код теперь:

public function testEditProduct() {
    $request = $this->getRequest();
    $request->setMethod('POST');
    $request->setPost(array(
        'id'=>'1',
        'title'=>'Test Product 1a'
    ));
    $this->dispatch('/product/edit/id/1');
    $this->assertRedirectTo('/');

    $this->reset();
    $this->bootstrap();
    $this->dispatch('/');
    $this->assertQueryContentContains('a', 'Test Product 1a');
}
public function testAddProduct() {
    $request = $this->getRequest();
    $request->setMethod('POST');
    $request->setPost(array(
        'title'=>'Test Product 3'
    ));
        $this->dispatch('/product/add/');
    $this->assertRedirectTo('/');

    $this->reset();
    $this->bootstrap();
    $this->dispatch('/');
    $this->assertQueryContentContains('a', 'Test Product 3');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...