我刚刚设法让Konacha运行我的客户端集成测试。
Konacha在iframe中运行ember应用程序进行测试。在我的应用程序中,我基于用户操作以编程方式创建img元素。当我设置'src'属性时,用于从服务器获取图像文件的结果url会添加'/ iframe'部分,如下所示:
http://0.0.0.0:3500/iframe/assets/regensberg/regensberg_1.jpg
这给出了 404(未找到)
当我从常规rails开发服务器
提供代码时,代码确实正常运行rails s
正确的网址应为:
http://0.0.0.0:3500/assets/regensberg/regensberg_1.jpg
任何想法为什么这样做是如何解决它?
*编辑*
查看Konacha代码,我找到 konacha / config / routes.rb中定义的路由
Konacha::Engine.routes.draw do
get '/iframe/*name' => 'specs#iframe', :format => false, :as => :iframe
root :to => 'specs#parent'
get '*path' => 'specs#parent', :format => false
end
我们看到此请求被传递给规范控制器中的iframe方法。
konacha / app / controllers / konacha / specs _ controller.rb 向我们展示404消息的来源。
module Konacha
class SpecsController < ActionController::Base
rescue_from Konacha::Spec::NotFound do
render :text => "Not found", :status => 404
end
def parent
@run_mode = params.fetch(:mode, Konacha.mode).to_s.inquiry
@specs = Konacha::Spec.all(params[:path])
end
def iframe
@spec = Konacha::Spec.find_by_name(params[:name])
@stylesheets = Konacha::Engine.config.konacha.stylesheets
end
end
end
查看模型,我们看到 Spec :: NotFound 来自哪里:
module Konacha
class Spec
class NotFound < StandardError
end
def self.all(path = nil)
paths = Konacha.spec_paths
paths = ENV["SPEC"].split(",") if ENV["SPEC"]
paths = paths.map { |p| new(p) }
if path.present?
paths = paths.select { |s| s.path.starts_with?(path) }.presence or raise NotFound
end
paths
end
def self.find_by_name(name)
all.find { |s| s.asset_name == name } or raise NotFound
end
attr_accessor :path
def initialize(path)
@path = path
end
def asset_name
path.sub(/(\.js|\.coffee).*/, '')
end
end
end
通过以上信息,我们可以看到为什么在将get请求发送到包含“iframe”的路径时,我们会收到错误消息而不是图像文件。那么,为什么网址包含'iframe'?
查看父视图代码:
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Konacha Tests</title>
<%= stylesheet_link_tag "konacha", :debug => false %>
<%= javascript_include_tag "mocha", "konacha/parent", :debug => false %>
<%= javascript_include_tag("konacha/runner", :debug => false) if @run_mode.runner? %>
</head>
<body>
<% @specs.each do |spec| %>
<%= content_tag :iframe, "", :src => iframe_path(spec.asset_name), :class => "test-context", "data-path" => spec.path %>
<% end %>
<div id="mocha"></div>
</body>
</html>
我们看到iframe的src是iframe路径,从上面的路由应该是:
0.0.0.0:3500/iframe/#{spec.assetName}
我像这样设置了img src参数:
img.src = "assets/" + filename
在发出请求之前,浏览器会将“0.0.0.0:3500/iframe/”添加到此前面。这似乎造成了真正的麻烦。如何防止iframe将此部分包含在基本URL中?
*完成编辑*
顺便说一句,有足够业力(> 1500)的人可以创建一个Konacha标签吗?
答案 0 :(得分:2)
assets/dir/filename.jpg
是一条相对路径;它相对于页面的基本URL进行解释,即http://0.0.0.0:3500/iframe/
,生成http://0.0.0.0:3500/iframe/assets/dir/filename.jpg
。您将要使用绝对路径/assets/dir/filename.jpg
,而使用前导斜杠。