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没有