Mik*_*e E 3 ruby-on-rails fixtures testunit
我正在尝试修复嵌套资源的功能测试.我的config/routes.rb
文件看起来像这样:
Shop360::Application.routes.draw do
resources :libraries do
resources :library_imports
end
end
Run Code Online (Sandbox Code Playgroud)
嵌套library_imports
资源会破坏生成的测试,如下所示:
test "should get index" do
get :index
assert_response :success
assert_not_nil assigns(:library_imports)
end
Run Code Online (Sandbox Code Playgroud)
因为嵌套会更改所有网址.
我已经在几个地方看到了通过添加如下library_id
参数来解决这个问题的建议:
test "should get index" do
get :index, :library_id => 1
assert_response :success
assert_not_nil assigns(:library_imports)
end
Run Code Online (Sandbox Code Playgroud)
(第二行改了)
为了使这个工作,我必须library_id
在我的library_import夹具中明确指定一个?自Rails 2.0以来,可以在夹具数据中定义关联,而无需借助这些显式的键定义.我现在被迫回到这只老鼠窝里,因为我正在筑巢资源吗?
有没有更好的方法让我的测试通过?
好吧,这并不像我想象的那么复杂.让我们从灯具开始:
libraries.yml
lib1:
name: lib1
description: Library one
lib2:
name: lib2
description: Library two
Run Code Online (Sandbox Code Playgroud)
library_imports.yml
import1:
name: import1
description: Import one
library: lib1
import2:
name: import2
description: Import two
library: lib2
Run Code Online (Sandbox Code Playgroud)
我以正确的方式在此夹具数据中创建关联(即没有显式键).
现在,回想一下失败的测试(在library_imports_controller_test.rb中):
test "should get index" do
get :index
assert_response :success
assert_not_nil assigns(:library_imports)
end
Run Code Online (Sandbox Code Playgroud)
在这个文件的顶部是安装回调,如下所示:
setup do
@library_import = library_imports(:import1)
end
Run Code Online (Sandbox Code Playgroud)
所以我可以在我的测试中引用@library_import(特别是它的library_id字段).我改变它是这样的:
test "should get index" do
get :index, :library_id => @library_import.library_id
assert_response :success
assert_not_nil assigns(:library_imports)
end
Run Code Online (Sandbox Code Playgroud)
我的测试从红色变为绿色.