【问题标题】:How to test Behat Context?如何测试 Behat Context?
【发布时间】:2015-08-08 10:39:08
【问题描述】:

Behat 是一个非常好的工具,恕我直言,BDD/TDD/DDD 是 SOLID 编码的基础,但是 ...

我经常看到使用 Behat 的项目具有未经测试的相当复杂的上下文类。

例如:Sylius/TaxonomyContextSylius/ProductContext

/**
 * @Given /^taxonomy "([^""]*)" has following taxons:$/
 */
public function taxonomyHasFollowingTaxons($taxonomyName, TableNode $taxonsTable)
{
    $taxonomy = $this->findOneByName('taxonomy', $taxonomyName);
    $manager = $this->getEntityManager();
    $taxons = array();
    foreach ($taxonsTable->getRows() as $node) {
        $taxonList = explode('>', $node[0]);
        $parent = null;
        foreach ($taxonList as $taxonName) {
            $taxonName = trim($taxonName);
            if (!isset($taxons[$taxonName])) {
                /* @var $taxon TaxonInterface */
                $taxon = $this->getRepository('taxon')->createNew();
                $taxon->setName($taxonName);
                $taxons[$taxonName] = $taxon;
            }
            $taxon = $taxons[$taxonName];
            if (null !== $parent) {
                $parent->addChild($taxon);
            } else {
                $taxonomy->addTaxon($taxon);
            }
            $parent = $taxon;
        }
    }
    $manager->persist($taxonomy);
    $manager->flush();
}

这个例子不是“火箭科学”,但它有很多地方是行不通的。 根据我的经验,Behat Contexts 可能会变得相当复杂。

我是否也应该如此“信任”我的上下文并假设它们 100% 正确工作? 或者是否有任何指南/教程如何测试 Behat Contexts?

你是做什么的?你怎么做呢?

【问题讨论】:

标签: php unit-testing bdd behat


【解决方案1】:

我想说这取决于您构建测试套件的方式。

由于 Behat 是一个构建您自己的测试套件的框架,并且由于它是一个要构建的软件,因此应该考虑最佳软件开发实践。其中之一是 MVC 概念。在 Behat 中,上下文是“控制器”,不应包含太多逻辑。理想情况下,他们应该在底层服务中调用所需的方法,这些方法将提供主要功能。

当然,对于简单的现成步骤(如 Mink 扩展等提供的步骤),创建一些测试非常容易,而对于更复杂的逻辑,我建议创建一个处理重量级逻辑、检查等的服务. 因此,您可以从各个方面测试隔离服务,同时保持您的“控制器”上下文非常干净和简单。

另一方面,如果您可以在不涉及大量隐藏逻辑的情况下创建测试(因为测试应该尽可能开放和干净),那么您不需要任何服务简单的句子就足够了。然后,如果你真的关心它们的质量,你可以创建一些小测试。

对于提供的示例中的复杂情况,我会尝试将一些代码封装到服务/管理器中,并让简单的控制器不做任何测试,同时为底层服务提供广泛的测试覆盖。

【讨论】:

  • 感谢您的提示。 (小题外话)最近我发现大多数人以“错误”的方式使用 Behat/Cucumber - 用于测试 GUI。正如这里 (everzet.com/post/99045129766/introducing-modelling-by-example) 中的示例所解释的那样,我也一直在使用它主要来测试 GUI,现在我知道为什么这不是一个好主意 - 我将停止这样做 - 只需将它用于 DDD。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
相关资源
最近更新 更多