如何为基本节目编写RSPEC,在Rails(有或没有FactoryGirl)中的基本节目,创建,破坏,编辑方法



我有一个基本的user_controller.rb文件:

class UserController < ApplicationController
  def new
    @user = User.new
  end
  def index
    @user = User.all
  end
  def show
    @user = User.find(params[:id])
  end
  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to @user
    else
      render 'new'
    end      
  end
  def edit
    @user = User.find(params[:id])
  end
  def update
    @user = User.find(params[:id])
  if @user.update(user_params)
      redirect_to @user
    else
      render 'edit'
    end
  end
 def destroy
  @user = User.find(params[:id])
  @user.destroy
  redirect_to action: 'index'
 end
 private
  def user_params
   params.require(:user).permit(:name, :key, :desc)
  end
end

这是我的(型号(用户.rb文件:

class User < ApplicationRecord
  validates :name,    presence: true
  validates :key,     uniqueness: true, presence: true
  validates :desc,    presence: true
end

并创建了一个Fortories.RB文件(在规格文件夹中(:

FactoryGirl.define do 
  factory :user do
   name "TestUser"
   key "TKey"
   desc "TestDescription"
  end
end

我尝试了几种使规格起作用的方法,但由于语法令人困惑,我不能。

唯一有效的是(对于crud操作中的'c',以下文件是user_controller_specs.rb(:

require 'rails_helper'
require 'factory_girl_rails'
RSpec.describe UserController, :type => :controller do
 let(:temp) { FactoryGirl.build(:user) }
 describe "POST create" do
  it "should redirect back to the index page" do
     post :create, :user => { :user => temp }
     expect(get: user_url(subdomain: nil)).to route_to(controller: "user", action: "index")
  end
 end
end

我浏览了几个教程,以找到对Crud操作的正确方法,但没有任何简单的规格。我正在尝试将它们写入规格/控制器文件夹中,但这些文件却出现了错误。编写规格的正确语法应该是什么?

ps:我是Ruby/Rails的新手,并试图用RSPEC和FactoryGirl编写测试案例。任何帮助都将不胜感激。

编辑: 也许我错误地构成了这个问题...我对语法部分更感兴趣。如果我知道一个示例如何编写一个示例,我将能够通过在这里和那里更改一些微小的逻辑来编写其他内容。...说我有一个基本的测试用例,只是为了查看是否更新用户详细信息不是由于验证而返回错误,我应该如何用(或不(工厂女孩宝石写它?

这是一个相当广泛的问题,但是在任何类型的测试中,您都希望测试任何可用的用例。示例 - 用户可能会遵循不同的路径。

因此,您希望您的测试涵盖基础知识。当您按下创建动作时,用户实际上是创建的吗?如果缺少相关的参数,是否会丢弃错误?用例将带来您的期望。

特别是使用RSPEC控制器,您将使用适当的动词和操作的名称,然后将其传递到任何必要的参数。

post :create, :user => { :user => temp }

基本上说:"对我的创建操作做一个邮政请求,并将其传递给这些卷曲括号内的参数。"

运行该RSPEC后,可让您访问响应。您可以随时在控制器请求后记录响应,以帮助您调试情况:p response

您会以期望跟进每种请求。期望应该回答以下问题:"我期望这项行动做什么?"例如,如果您击中用户更新操作并传递了一个参数以将用户的年龄更改为21岁,那么您的期望可能是:

expect(user.age).to eq(21)

RESSEC的RSPEC文档是一个很好的资源。https://relishapp.com/rspec

"如何"做一个广泛的一般事情是一个棘手的问题。我的建议是尝试实际测试一个,记录故障案例,并将这些日志发布在一个新问题中,并在一个新问题中发布这些日志,因此可以帮助您通过测试您正在挣扎的特定动作来工作。

最新更新