【问题标题】:Testing multi-tenancy Laravel applications using Behat / Mink and Behat Laravel Extension使用 Behat / Mink 和 Behat Laravel Extension 测试多租户 Laravel 应用程序
【发布时间】:2015-08-01 08:43:41
【问题描述】:

我正在构建一个多租户 SaaS 应用程序,我正在尝试使用 Behat 编写测试,使用 Mink 和 Behat Laravel Extension

当您注册帐户时,您会在网站{account}.tenancy.dev 上获得自己的子域

我的behat.yml 文件如下所示:

default:
    extensions:
        Laracasts\Behat:
            # env_path: .env.behat
        Behat\MinkExtension:
            default_session: laravel
            base_url: http://tenancy.dev
            laravel: ~

当我尝试测试我的注册流程时,我遇到了直接的问题,我收到一个 404 错误,测试新的子域是否可以访问,所有数据都已正确保存,手动测试流程是否有效并且子域路由有效。

我想知道是否有任何方法可以使用 Behat 执行此操作,以及如何设置 Behat / Mink 以使用通配符子域来测试 SaaS 应用程序?

我正在 Homestead 虚拟机中运行测试。

【问题讨论】:

    标签: php laravel-5 multi-tenant behat mink


    【解决方案1】:

    base_url: http://tenancy.dev 配置用于在您在 mink 步骤中使用相对路径 URL 时生成完全限定的域 URL(即“/home”)。

    当您想要访问与base_url 中指定的域不同的域时,您所要做的就是在您的步骤中使用完全限定的域 URL,例如“http://test.tenancy.dev/fully/qualified”。

    因此,请使用base_url 配置将您将在大部分步骤中使用的内容设置为相对 url,然后明确指定例外的完整域。

    When I create an account named foo And GET "http://foo.tenancy.dev/ping" Then I get a 200 response code When I GET "/home" Then the response contains "Sign Up"

    如果您的大部分测试将针对子域,请将其设置为您的 base_url 并在必要时明确指定您的顶级域。

    【讨论】:

    • 这就是我正在做的事情,它给了我一个 404 错误,因为 Behat 在沙箱中运行代码,因此,子域永远不会添加到沙箱中。我认为我需要的是 Behat 允许通配符子域处理之类的东西。
    • 您所描述的不是 Behat 的责任。允许您的沙盒主机响应 *.domain.com 的配置归结为您的 Web 服务器(apache、nginx 等)配置。我怀疑你只需要配置你的沙盒网络服务器,将所有到 *.tenancy.dev 的流量定向到你的应用程序目录。
    【解决方案2】:

    您可以使用xip.io 解析子域,例如,如果您无法访问 CI 服务器上的 /etc/hosts 文件,这将特别有用。

    要将{account}.tenancy.dev 路由到您的本地网络服务器,您可以使用解析为127.0.0.1 的account.tenancy.dev.127.0.0.1.xip.io

    【讨论】:

    • 我不确定 Behat 是否可以与 xip.io 一起使用,但我现在会尝试并告诉您会发生什么。
    【解决方案3】:

    过了一会儿,我重新审视了这个问题,发现了一个相当简单的解决方案,可以在我的FeatureContext.php 中使用:

    $this->setMinkParameter('base_url', $url);
    

    这会更改它用于任何场景的基本 url:

    /**
     * @Given I visit the url :url
     */
    public function visitDomain($url)
    {
        $this->setMinkParameter('base_url', $url);
        $this->visit('/');
    }
    

    使用方式如下:

    Scenario: Test Multi Tenancy
      Given I have a business "mttest"
      When I visit the url "http://mttest.example.com"
      Then I should see "mttest"
    

    显然这有点做作,但确实表明我打算做的事情是可能的。

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      相关资源
      最近更新 更多