Behat传递测试步骤中的值

时间:2016-12-07 14:41:28

标签: testing behat mink

我正在尝试断言在一个字段中输入的随机文本出现在下一页(确认)

我这样做

When I fill in "edit-title" with random value of length "8"

/**
     * Fills in form field with specified id|name|label|value with random string
     * Example: And I fill in "bwayne" with random value of length "length"
     *
     * @When /^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with random value of length "(?P<length>(?:[^"]|\\")*)"$/
     */
    public function fillFieldWithRandomValue($field, $length)
    {
        $field = $this->fixStepArgument($field);
        $value = $this->generateRandomString($length);
        $this->getSession()->getPage()->fillField($field, $value);
    }

我想做断言 - 就像这样:

Then I should see text matching "<RANDOM VALUE ENTERED IN THE PREVIOUS STEP>"

有可能吗?

更新

但如果我想多次使用generateRandomString方法然后一个接一个地获取这些方法的值,那么使用setter和getter会是什么样子?我是否必须为每个测试步骤制作变量和函数?像这样:

When I fill in "x" with random value of length "8"
And I fill in "y" with random value of length "12"
And I go to other page
Then I should see text matching "VALUE ENTERED TO X"
And I should see text matching "VALUE ENTERED TO Y"

2 个答案:

答案 0 :(得分:1)

您可以创建属性并在上一步中进行设置。并在下一个中使用它,但如果它有价值则断言它。 使用适当的可见性类型

定义该属性也是很好的和可读的
/**
 * @var string
 */
private randomString;

/**
 * Fills in form field with specified id|name|label|value with random string
 * Example: And I fill in "bwayne" with random value of length "length"
 *
 * @When /^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with random value of length "(?P<length>(?:[^"]|\\")*)"$/
 */
public function fillFieldWithRandomValue($field, $length)
{
    $field = $this->fixStepArgument($field);
    $this->randomString = $this->generateRandomString($length);
    $this->getSession()->getPage()->fillField($field, $this->randomString);
}

/**
 *
 * @Then /^(?:|I )should see that page contains random generated text$/
 */
public function assertPageContainsRandomGeneratedText()
{
    //Assertion from phpunit
    $this->assertNotNull($this->randomString);

    $this->assertPageContainsText($this->randomString);
}

注意:根据您的behat设置 - 来自phpunit的断言可能无效。

答案 1 :(得分:1)

由于您将在多个地方调用 import Testfile Testfile.greeting() 方法,因此您还应该有一种方法可以像{set}和getter这样获取generateRandomString这个值。

我的建议是建立一个具有处理所有数据的相关方法的类,而不是在您将使用数据的每个地方保存变量,生成+保存并从您需要的任何地方读取。

  

提示:您可以对步骤定义更加灵活,并且如果没有提供随机字符串,则可以使用默认长度。

高级示例:

class Data
{

    public static $data = array();

    public static function generateRandomString($length = null, $name = null)
    {
        if ($name = null) {
            $name = 'random';
        };
        if ($length = null) {
            $length = 8;
        };
        // generate string like  $string =
        return self::$data[$name] = $string;
    }

    public static function getString($name = null)
    {
        if ($name = null) {
            $name = 'random';
        };
        // exception handling
        if (array_key_exists($name, self::$data) === false) {
            return null;
        }

        return self::$data[$name];
    }

}

在上下文中:

getRandomString
  

这是高级示例,您可能需要进行一些调整。

如果您在同一个班级中进行了验证,那么您也可以在同一个班级中拥有所有这些内容,这意味着/** * @Then /^I fill in "x" with random value as (.*?)( and length (\d+))?$/ */ public function iFillInWithRandomValue($selector, $name, $length = null){ $string = Data::generateRandomString($length, $name); // fill method } /** * @Then /^I should see text matching "first name"$/ */ public function iShouldSeeTextMatching($variableName){ $string = Data::getString($variableName); // assert/check method } generateRandomString在同一个班级中包含这些步骤。