Yii2 Codeception功能测试-单击确认对话框的OK按钮

时间:2018-10-04 19:45:13

标签: yii2 functional-testing codeception

我是Yii2和编程测试的新手。 我正在使用Codeception进行测试。

摘要
在我的一项测试中,我必须单击确认对话框的“确定”按钮。为此,我尝试了:
$ I-> click('OK');
$ I-> acceptPopup();
他们俩都不起作用。

详细信息
我使用ActiveRecord处理产品表(“ productos”),并使用Gi​​i生成脚本。

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "productos".
 *
 * @property int $id
 * @property string $codigo
 * @property string $descripcion
 * @property double $cantidad
 * @property double $precio
 * @property string $fefecto
 *
 * @property DetallesPedido[] $detallesPedidos
 */
class Productos extends \yii\db\ActiveRecord
{
/**
 * {@inheritdoc}
 */
public static function tableName()
{
    return 'productos';
}

/**
 * {@inheritdoc}
 */
public function rules()
{
    return [
        [['codigo', 'descripcion', 'precio', 'fefecto'], 'required'],
        [['cantidad', 'precio'], 'number'],
        [['fefecto'], 'date', 'format'=>'yyyy-M-d'],
        [['fefecto'], 'safe'],
        [['codigo'], 'string', 'max' => 10],
        [['descripcion'], 'string', 'max' => 60],
    ];
}

/**
 * {@inheritdoc}
 */
public function attributeLabels()
{
    return [
        'id' => 'ID',
        'codigo' => 'Codigo',
        'descripcion' => 'Descripcion',
        'cantidad' => 'Cantidad',
        'precio' => 'Precio',
        'fefecto' => 'Fecha Alta',
    ];
}
}

与Productos.php关联的视图的脚本为:     

use yii\helpers\Html;
use yii\widgets\DetailView;

/* @var $this yii\web\View */
/* @var $model app\models\Productos */

    $this->title = $model->id . ' - ' . $model->codigo;
    $this->params['breadcrumbs'][] = ['label' => 'Productos', 'url' => ['index']];
    $this->params['breadcrumbs'][] = $this->title;
?>
<div class="productos-view">

    <h1><?= Html::encode($this->title) ?></h1>

    <p>
        <?= Html::a('Update', ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?>
        <?= Html::a('Delete', ['delete', 'id' => $model->id], [
            'class' => 'btn btn-danger',
            'data' => [
                'confirm' => 'Are you sure you want to delete this item?',
                'method' => 'post',
            ],
        ]) ?>
    </p>

    <?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            'id',
            'codigo',
            'descripcion',
            'cantidad',
            'precio',
            'fefecto',
        ],
    ]) ?>

</div>

功能测试脚本:

<?php

use app\models\Productos;

class ProductosCest
{
public function _before(\FunctionalTester $I)
{
    //Deleting all products from database
    Productos::deleteAll();

    $I->amLoggedInAs(100);//Logarse
    $I->amOnRoute('productos/index');

    // Loading product on database
    $I->haveRecord(Productos::className(), [
        'id' => 1,
        'codigo' => 'PA01',
        'descripcion' => 'Paleta de acero triangular de 20 cm',
        'cantidad' => 1,
        'precio' => 10.53,
        'fefecto' => '2017-03-12',
    ]);
}

public function _after(\FunctionalTester $I)
{
    $I->click(['class' => 'btn-link']);//Logout

    //Deleting all products from database
    Productos::deleteAll();

}

public function deleteProducto(\FunctionalTester $I)
{
    $I->amGoingTo('delete a product');
    $I->amOnRoute('productos/delete', ['id' => 1]); //Click delete button from id=1

    //Pulsar el botón Aceptar
    /*
    $I->performOn('.confirm', \Codeception\Util\ActionSequence::build()
    ->see('Are you sure you want to delete this item?')
    ->click('Aceptar')
    );
    */
    $I->acceptPopup();

    $I->expect('be in the index product view');
    $I->see('Productos', 'h1');

    $I->expect('the product is not in the index product view');
    $I->dontSee('Paleta de acero triangular de 20 cm');

}

}

运行测试时,我得到:

有1个失败:


1)ProductosCest:删除producto  测试测试/功能/ProductosCest.php:deleteProducto  步骤单击{“ class”:“ btn-link”}  找不到按名称显示的“失败链接”或“按钮”,或者未找到类为“ btn-link”的CSS或XPath元素。

场景步骤:

    在test / functional / ProductosCest.php:28
  1. $ I-> click({“ class”:“ btn-link”})
  2. $ I-> amOnRoute(“ productos / delete”,{“ id”:1})在tests / functional / ProductosCest.php:132
  3. //我要删除产品
  4. $ I-> haveRecord(“ app \ models \ Productos”,{“ id”:1,“ codigo”:“ PA01”,“ descripc ...})在测试/功能/ProductosCest.php:17 < / li>
  5. $ I-> amOnRoute(“ productos / index”)at tests / functional / ProductosCest.php:13
  6. $ I-> amLoggedInAs(100)at tests / functional / ProductosCest.php:12

如您所见,一行出现问题:
    $ I-> acceptPopup();
因为消息“在索引产品视图中”没有出现在测试日志中。

屏幕截图
View products

Confirm Dialog

1 个答案:

答案 0 :(得分:1)

您在功能测试中使用Yii2模块,对吗? 该模块不执行javascript代码,因此不会显示确认对话框。

要测试确认对话框,必须使用acceptance套件中通常使用的WebDriver模块。

acceptPopup方法仅适用于由window.alert,window.confirm或window.prompt创建的本机弹出窗口。 如果您使用模式窗口(看起来像您一样),则必须使用click方法来单击它。