Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing Rails 4测试新手-入门需要帮助(rSpec和Desive)_Testing_Ruby On Rails 4_Devise_Rspec2 - Fatal编程技术网

Testing Rails 4测试新手-入门需要帮助(rSpec和Desive)

Testing Rails 4测试新手-入门需要帮助(rSpec和Desive),testing,ruby-on-rails-4,devise,rspec2,Testing,Ruby On Rails 4,Devise,Rspec2,我对测试比较陌生,对Rails4和rSpec也非常陌生。我试图测试一个使用Desive进行身份验证的控制器,但我被卡住了。我能找到的所有示例都是针对Rails 3的 我使用的是Rails 4.0.3、Desive 3.2.3、rSpec 2.14.1和FactoryGirl 4.4.0 class LessonPlansController < ApplicationController before_action :authenticate_user! # GET /lesso

我对测试比较陌生,对Rails4和rSpec也非常陌生。我试图测试一个使用Desive进行身份验证的控制器,但我被卡住了。我能找到的所有示例都是针对Rails 3的

我使用的是Rails 4.0.3、Desive 3.2.3、rSpec 2.14.1和FactoryGirl 4.4.0

class LessonPlansController < ApplicationController
  before_action :authenticate_user!

  # GET /lesson_plans
  def index
    @lesson_plans = current_user.lesson_plans.to_a
  end

  .
  .
  .

private
  # Use callbacks to share common setup or constraints between actions.
  def set_lesson_plan
    @lesson_plan = LessonPlan.find(params[:id])
  end

  # Only allow a trusted parameter "white list" through.
  def lesson_plan_params
    params[:lesson_plan]
  end

  def lesson_plan_params
    params.require(:lesson_plan).permit(:title, :synopsis)
  end
end
测试部分就是我被卡住的地方

describe LessonPlansController do
  let(:valid_attributes) { {  } }
  let(:valid_session) { {} }

  # describe "GET index" do
  it "assigns all lesson_plans as @lesson_plans" do
    user=FactoryGirl.create(:user)
    sign_in user
    lesson_plan = LessonPlan.create! valid_attributes
    get :index, {}, valid_session
    assigns(:lesson_plans).should eq([lesson_plan])
  end
end
我不确定要在有效的\u属性和有效的\u会话中放置什么(或者我是否需要它们)。测试将在用户登录时进行,但在创建课程计划时将失败。诚然,这是rSpec的默认/生成测试,但我不确定如何继续

我看到的示例使用before块来设置用户。我在Desive wiki页面上找不到任何关于如何为需要用户登录的控制器编写基本rSpec测试的内容。任何指点都将不胜感激

“我不确定在有效的\u属性和有效的\u会话中放置什么(或者我是否需要它们)。”

那要看你在测试什么。。假设您正在测试验证&希望确保在x列设置为null时不会创建记录。。。然后,您可以尝试专门创建一个具有无效属性的记录(例如,
列:nil
),并期望结果不会返回true;也许您希望确保它是使用有效属性创建的


顺便说一句,因为您使用的是FactoryGirl,所以可以使用(:工厂名称)的“属性”。不,您不一定需要在课程计划工厂中指定用户id;除非您总是希望它引用用户1。您可以简单地引用没有值的用户。查看第3-5部分,特别是第3-5部分,了解RSPec测试的介绍。。当我刚开始学习时,我发现这是一个非常容易遵循的指南。

该规范可能会在这一点上失败,因为您需要创建一个没有属性的课程计划。这是有道理的。我将更仔细地看一下。我有一个课程计划模型的测试(通过)。我将尝试使用(:lesson_plan)属性,但我想知道如何传递应该为当前用户创建的课程计划,因为这就是我的控制器创建课程计划的方式:
@lesson_plan=current_user.lesson_plans.new(lesson_plan_params)
我用rSpec购买了《每日测试》一书。我大部分时间都被设计的部分挂住了。每日系列很有帮助。而且。。我建议将
config.include FactoryGirl::Syntax::Methods
添加到您的spec助手中。。这允许您调用
create()
build()
等。。如果没有
FactoryGirl
前缀,您只需覆盖用户id(或用户..取决于工厂的定义方式和创建新记录的方式)即可将其与用户关联。。。例如
create(:课程计划,用户id:user.id)。不要过于担心测试和设计功能。。这就是为什么他们提供帮助器方法,比如
sign_in`。。使用这些帮助程序可以访问应用程序中的特定状态,并测试从那时起您自己的代码应该做什么。找帮手。。您最好的参考将是Desive自己的文档,在指南的测试部分。谢谢您的帮助。我将构建行更改为:
lesson\u plan=LessonPlan.create!如您所建议的(:lesson\u plan,:user=>user)
的属性,添加用户参数。
describe LessonPlansController do
  let(:valid_attributes) { {  } }
  let(:valid_session) { {} }

  # describe "GET index" do
  it "assigns all lesson_plans as @lesson_plans" do
    user=FactoryGirl.create(:user)
    sign_in user
    lesson_plan = LessonPlan.create! valid_attributes
    get :index, {}, valid_session
    assigns(:lesson_plans).should eq([lesson_plan])
  end
end