首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PHPSpec规范文件中创建可用于规范中所有示例的类变量

如何在PHPSpec规范文件中创建可用于规范中所有示例的类变量
EN

Stack Overflow用户
提问于 2017-09-18 20:14:56
回答 2查看 752关注 0票数 1

我有一个包含许多示例的PHPSpec类。我希望能够在spec类中创建类变量,该类中的任何示例函数都可以使用这些变量。

以下是一个非常简化的版本:

代码语言:javascript
复制
class ThingImTestingSpec extends ObjectBehavior
{
    private $common_variables_array = [
        'property_1' => value_1,
        'property_2' => 'Value 2'
    ];

    function it_finds_a_common_property()
    {
        $object_1 = new ConstructedObject;

        $this->find_the_common_property($object_1)->shouldReturn($this->common_variables_array['property_1']);
    }
}

问题在于PHPSpec (聪明地)如何实例化和引用被测试的类。规范方法中对$this的引用实际上指的是测试对象,而不是spec类本身。

但这意味着尝试使用$this->class_variable引用测试对象上的类变量来引用类变量,而不是使用规范。

所以。如何在spec类本身的范围内创建一组变量,这些示例可以在运行时访问这些变量?

我尝试过的事情:

  • 将类变量放置在构造函数中--仍然不能通过示例访问
  • 使用beConstructedWith -需要修改测试中的类,这样就可以进行测试。不是一个干净的解决方案。
  • 当我想要引用的公共对象是数据库记录时,我可以通过id (或其他属性)引用它们,每次都使用雄辩的方法,从Model构建一个集合或类对象。可以工作,但这是耗时的,因为我需要在每个规范函数中构建集合或对象。当spec类被实例化时,我想构建这些集合和对象一次,并在整个类中引用它们。

我还没试过的事情:

  • 在spec类和被测试类的作用域之外创建第三个对象,以容纳通用对象和变量,这些对象和变量可以由spec类方法(示例)在运行时访问。这个解决方案可以工作,但它增加了一个层的规格,我想避免如果有一个更干净的解决方案。

注意:我并不是在寻找以上述方式进行测试的“替代方案”,除非它们仍然适合更广泛的需求。这个例子被大大缩减了。实际上,我正在扩展LaravelObjectBehavior (https://github.com/BenConstable/phpspec-laravel),使用规范的构造函数通过工厂和Faker类(https://github.com/thephpleague/factory-muffin)在测试数据库中创建记录,并在测试之后销毁它们(League\FactoryMuffin\Facade::deleteSaved(),在spec的析构函数中)。我希望能够在任意数量的规范函数中引用由模型(并由FactoryMuffin创建)表示的对象,因此我不必在每个规范函数中重新创建这些对象和集合。是的,我知道这超出了“规范”测试的范围,但是当一个应用程序被绑定到一个模型中时,与数据层交互的对象仍然是“spec线缆”,这是可以争辩的。

我目前正在使用phpspec 2.2.1和Laravel 4.2

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-20 14:18:51

我们目前在软件中使用PHPSpec v3。请使用let方法声明常见的事物。简单的例子:

代码语言:javascript
复制
<?php

class ExampleSpec extends \PhpSpec\ObjectBehavior
{
    private $example; // private property in the spec itself

    function let()
    {
        $this->example = (object) ['test1' => 'test1']; // setting property of the spec
        parent::let();
    }

    function it_works()
    {
        var_dump($this->example); // will dump: object(stdClass)#1 (1) { ["test1"] => string(5) "test1" }
    }

    function it_works_here_as_well()
    {
        var_dump($this->example); // will dump same thing as above: object(stdClass)#1 (1) { ["test1"] => string(5) "test1" }
        $this->example = (object) ['test2' => 'test2']; // but setting here will be visible only for this example
    }

    function it_is_an_another_example()
    {
        var_dump($this->example); // will dump same thing first two examples: object(stdClass)#1 (1) { ["test1"] => string(5) "test1" }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2017-09-24 21:26:01

找到答案了。显式声明类变量为static,规范类中的方法可以访问它们:

代码语言:javascript
复制
class ThingImTestingSpec extends ObjectBehavior
{
    private static $common_variables_array = [
        'property_1' => value_1,
        'property_2' => 'Value 2'
    ];

    function it_finds_a_common_property()
    {
        $object_1 = new ConstructedObject;

        $this->find_the_common_property($object_1)->shouldReturn($this::$common_variables_array['property_1']);
    }
}

这适用于数组以及表示使用雄辩的方法构建的数据库记录的对象。

代码语言:javascript
复制
class LaravelAppClassImTestingSpec extends LaravelObjectBehavior
{
    private static $Order_1;

    function __construct()
    {
        $Order_1 = \Order::find(123);
    }

    function it_tests_a_thing()
    {
        //(the method has access to the static class variable via
        //$this::$Order_1
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46287513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档