Ruby on rails Rails测试环境中的确认链接呈现:禁止您使用';我没有访问/使用/确认此服务器的权限

Ruby on rails Rails测试环境中的确认链接呈现:禁止您使用';我没有访问/使用/确认此服务器的权限,ruby-on-rails,capybara,factory-bot,minitest,Ruby On Rails,Capybara,Factory Bot,Minitest,我有一个User类,它使用designe:confirmable,当创建一个用户时,它会触发一封包含确认链接的电子邮件。这在开发和生产中非常有效,但在测试环境(Minitest/Capybara)中失败。具体来说,单击确认链接会导致**禁止**您没有访问此服务器上的/users/confirmation的权限 截图: 奇怪的是,当我从rails控制台创建用户时,就像我在集成测试中所做的那样,它工作正常。那么,为什么它在测试环境中失败呢 测试: 此类确认链接在除测试外的所有环境中都是这样的: h

我有一个
User
类,它使用
designe:confirmable
,当创建一个用户时,它会触发一封包含确认链接的电子邮件。这在
开发
生产
中非常有效,但在
测试
环境(Minitest/Capybara)中失败。具体来说,单击确认链接会导致
**禁止**您没有访问此服务器上的/users/confirmation的权限

截图:

奇怪的是,当我从
rails控制台创建用户时,就像我在集成测试中所做的那样,它工作正常。那么,为什么它在
测试环境中失败呢

测试:

此类确认链接在除测试外的所有环境中都是这样的:

http://localhost:3000/users/confirmation?confirmation_token=TxYdRmVzcuPE7PAx7yJh
…在
test
中,它们如下所示:

http://localhost/users/confirmation?confirmation_token=NqyaVL5EKEnz46zMzDQs
(测试中未指定端口)


在这些集成测试中,我使用带Capybara驱动程序的
Rails 5.2.0

这是因为电子邮件中生成的URL没有指向Capybara服务器。有几种方法可以解决这个问题。两个最简单的解决方案是

  • 修复端口Capybara运行其测试服务器并设置电子邮件生成参数

    Capybara.server_port = 1111 # any fixed port number
    
    # in config/environments/test.rb
    config.action_mailer.default_url_options = {:host => 'localhost', port: '1111'} # match whatever server host and port Capybara is running on
    
  • 继续允许Capybara在随机端口上运行,将url生成配置为不包含端口,并将Capybara设置为在未明确指定其他端口时始终包含服务器端口

    Capybara.always_include_port = true
    
    # in config/environments/test.rb
    config.action_mailer.default_url_options = {:host => 'localhost'} # match the host Capybara is running the test server on
    

  • 这是因为电子邮件中生成的URL没有指向Capybara服务器。有几种方法可以解决这个问题。两个最简单的解决方案是

  • 修复端口Capybara运行其测试服务器并设置电子邮件生成参数

    Capybara.server_port = 1111 # any fixed port number
    
    # in config/environments/test.rb
    config.action_mailer.default_url_options = {:host => 'localhost', port: '1111'} # match whatever server host and port Capybara is running on
    
  • 继续允许Capybara在随机端口上运行,将url生成配置为不包含端口,并将Capybara设置为在未明确指定其他端口时始终包含服务器端口

    Capybara.always_include_port = true
    
    # in config/environments/test.rb
    config.action_mailer.default_url_options = {:host => 'localhost'} # match the host Capybara is running the test server on
    

  • 您使用的是什么版本的Rails,您使用的是哪种驱动程序?另外,确认链接将连接到端口3000——您是否确实在端口3000上运行测试服务器?通常这就是开发服务器哇!非常感谢你。你的想法是对的。。。这与港口有关!通过将
    Capybara.server\u port='3000'
    添加到
    test/test\u helper.rb
    ,并通过
    confirmation\u link.gsub修改(在集成测试中)电子邮件生成的URL!(/localhost/,“localhost:{Capybara.server\u port}”)
    ,它立即起作用。后者感觉不像是一个长期的解决方案,因为它看起来很脆弱,但它确实证实了这个问题。理想情况下,生成的URL将使用提供的端口号。也许你可以在这方面提出建议?无论哪种方式,请提供一个答案,我会接受它!。。。或者也许有一种不同的更好的方法来做到这一点。。。比如让生成的URL包含当前端口号(因为我看到它会随着每次测试运行而改变…例如,
    监听)tcp://127.0.0.1:60770
    监听tcp://127.0.0.1:60127
    监听tcp://127.0.0.1:58623
    )。您使用的是什么版本的Rails,你在水豚身上使用哪种驱动程序?另外,确认链接将连接到端口3000——您是否确实在端口3000上运行测试服务器?通常这就是开发服务器哇!非常感谢你。你的想法是对的。。。这与港口有关!通过将
    Capybara.server\u port='3000'
    添加到
    test/test\u helper.rb
    ,并通过
    confirmation\u link.gsub修改(在集成测试中)电子邮件生成的URL!(/localhost/,“localhost:{Capybara.server\u port}”)
    ,它立即起作用。后者感觉不像是一个长期的解决方案,因为它看起来很脆弱,但它确实证实了这个问题。理想情况下,生成的URL将使用提供的端口号。也许你可以在这方面提出建议?无论哪种方式,请提供一个答案,我会接受它!。。。或者也许有一种不同的更好的方法来做到这一点。。。比如让生成的URL包含当前端口号(因为我看到它会随着每次测试运行而改变…例如,
    监听)tcp://127.0.0.1:60770
    监听tcp://127.0.0.1:60127
    监听tcp://127.0.0.1:58623
    ),谢谢你!到目前为止,我一直没有完成这项任务。我尝试了上面的选项1,但没有成功;另外,您不是想使用引号(
    Capybara.server\u port='1111'
    )吗?我试过引用和不引用,都没有用。选项2确实起了作用,所以谢谢你。但你知道为什么选项1不起作用吗?并且:设置
    Capybara.server\u port='3000'
    (即使用与dev相同的端口)有什么问题。。。可能出现什么问题/症状?@user664833不知道为什么选项1对您不起作用——检查电子邮件中生成的URL是否正确。至于端口3000——如果您将Capybara设置为在端口3000上运行测试,那么在测试运行时,您就不能继续在您的开发实例上开发了。我最终找到了以前调试中的一行旧代码(在得到您的帮助之前),而这行旧代码只是在洗牌过程中丢失了,碰巧在这里遇到了阻碍。无论如何,现在我已经让选项1工作了,我可以确认
    server\u port
    是否有引号并不重要。它可以写成
    Capybara.server\u port='1111'
    Capybara.server\u port=1111
    。谢谢!到目前为止,我一直没有完成这项任务。我尝试了上面的选项1,但没有成功;另外,您不是想使用引号(
    Capybara.server\u port='1111'
    )吗?我试过引用和不引用,都没有用。选择2没有