2

在我的规范中,我使用 AssetUrlHelper:

include ActionView::Helpers::AssetUrlHelper

这样我就可以测试一个应该显示我的一个文件的绝对 URL 的页面。我认为asset_url应该做的伎俩:

asset_url(img.img_file(:medium))

不幸的是,当规范运行时,它没有主机名,例如

(byebug) asset_url("blurg.jpg")
"/images/blurg.jpg"

...即使我将主机名指定为选项也不行:

(byebug) asset_url("blurg.jpg", host: "myhost.com")
"/images/blurg.jpg"

至少第二种情况很奇怪,因为它与源中的这条评论相矛盾:

# If :host options is set, it overwrites global
# +config.action_controller.asset_host+ setting.
#
# ...
#
#   asset_url "application.js"                                 # => http://example.com/assets/application.js
#   asset_url "application.js", host: "http://cdn.example.com" # => http://cdn.example.com/assets/application.js

这导致了一个错误直到现在才被发现。我的测试认为我的视图输出(错误地)的相对文件路径与应该存在的绝对 url 之间没有区别:

myhost.com/images/blurg.jpg #what I expect the test to check for
/images/blurg.jpg #what the test actually checks for

视图的内容无关紧要。我知道如何解决它。我想知道这个案例和将来的参考,为什么这个助手在测试中没有像我预期的那样表现,以及如何修复测试

4

1 回答 1

0

功能规范没有加载必要的 Rails 框架来计算主机。:host提供选项不起作用,我有点惊讶,但不是很大,因为 Rails 内部有很多关于引用路由的 URL 的智能,解决了很多事情,并且通常尝试变得非常智能。

如果您切换到控制器规范,那么您会发现正确的上下文已足够存根,asset_url可以像宣传的那样工作(没有:host选项)。

于 2015-04-29T00:38:23.780 回答