gpt4 book ai didi

ruby-on-rails - 使用 rspec rails4 进行简单的 Controller 测试

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:57 25 4
gpt4 key购买 nike

我最近正在研究一些 rspec 测试,我想知道如何正确测试 Controller 。我的 Controller 相当简单,所以应该不会太难:

 class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]

# GET /users
def index
@q = User.search(params[:q])
@users = @q.result(distinct: true)
@q.build_condition if @q.conditions.empty?
@q.build_sort if @q.sorts.empty?
end

# GET /users/1
def show
end

# GET /users/new
def new
@user = User.new
end

# GET /users/1/edit
def edit
end

def archive
@q = User.search(params[:q])
@users = @q.result(distinct: true)
@q.build_condition if @q.conditions.empty?
@q.build_sort if @q.sorts.empty?
end

# POST /users
def create
@user = User.new(user_params)
if @user.save
redirect_to users_path, notice: 'Student was successfully added.'
else
render action: 'new'
end
end

# PATCH/PUT /users/1
def update
if @user.update(user_params)
redirect_to @user, notice: 'Student information was successfully updated.'
else
render action: 'edit'
end
end

# DELETE /users/1
def destroy
@user.destroy
redirect_to users_url, notice: 'Student information was successfully deleted.'
end

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

# Only allow a trusted parameter "white list" through.
def user_params

params.require(:user).permit(:firstName, :lastName, :email, :dateOfBirth, :notes, :sex, :archive, :category => [])

end
end

到目前为止,我已经编写了 2-3 个测试,但我不确定它们是否做了任何事情:

describe 'GET #index' do
it "displays all users" do
get :index
response.should be_redirect
end
end

describe 'GET #new' do
it "creates a new user" do
get :new
response.should be_redirect
end
end

我尝试对编辑和显示做同样的事情,但它们没有用,我不确定为什么(因为正如我所说,我不知道我在做什么)。任何人都可以给我一些这些方法的测试示例,或者可以将我重定向到 rails4 的 rspec 指南吗?

最佳答案

您是否希望 Controller #index 操作重定向?因为那不是典型的。我愿意

describe 'GET #index' do
get 'index'
it {expect(response).to be_success)}
end

这一行...

it "displays all users" do

在 Controller 规范中,我想知道您是否混淆了 Controller 和请求规范。当我第一次运行测试时,我就这样做了。 “显示所有用户”对我来说听起来像是一个请求规范。测试页面是否重定向或响应状态代码更类似于 Controller 规范。

我找到了 http://betterspecs.org/成为更好地理解测试的真正有用的资源。

回复:要测试什么

这对我有用,但结果可能会有所不同。

Controller 规范 - 不要测试 Controller

Controller 应该很瘦,这样您就可以测试 Rails 是否正常工作。例如索引操作可能包含 @users = User.all 或类似内容,其他很少。那里有什么可以测试的?没有什么。如果您的 Controller 操作中有很多代码,那么它可能不应该存在。将其移出模型。记住:胖模型,瘦 Controller 。这是测试如何创建更好代码的示例。我的 Controller 规范很少,我认为几乎所有 Controller 规范都对页面授权进行双重检查。我只在 Controller 中有代码的地方使用它们。这是一个例子:

context "Non admin signed in" do
before(:each) do
sign_in user
controller.stub!(:current_user).and_return(user)
end

it {subject.current_user.should_not be_nil}
it "deny non admin access to index" do
sign_in user
get 'index'
expect(response).to render_template("pages/access_denied")
end

结束

请求规范测试您将在浏览器中测试的内容(20% 的测试)

假设您没有进行 RSpec 测试。如果您像我一样,那么这并不难想象。你将如何测试你想要构建的东西?您要做的第一件事很可能是加载浏览器,然后查看页面上是否有您期望的内容。那一个请求规范。就这么简单。请求规范是加载浏览器、点击几个按钮并检查发生了什么的自动方式。无论您在浏览器中检查什么...使用 Capybara 检查同样的事情。如果它在页面上有 Javascript,那么您将需要在 Capybara 之上安装 Webkit 或 Selenium 来按您想要的按钮。使用 selenium,您实际上会看到浏览器窗口在桌面上弹出,就好像神秘的 gremlin 控制了您的键盘一样。不要测试请求规范中不会在浏览器中手动测试的任何内容。这意味着不要检查数据库中其他模型的状态。请求规范是用户可以看到的内容。如果看不到,请不要测试。

模型规范 - 测试您将在控制台中测试的内容(80% 的测试)在我成为一个好的 TDD/BDD 男孩之前,我发现我花了很多时间加载 irb 或控制台并制作模型并做 X 看看 Y 是否会发生。自动化那个东西。那是模型规范。当您的请求规范失败时(如果它正在做任何有用的事情,它应该首先失败)然后下降到模型规范中。失败的请求规范可能是:

it {expect(page.find('#login_box')).to have_content 'Logged in as Kevin Monk'}

来自

no method full_name for instance of User

如果您不是 TDD 好 child ,您可能会加载控制台并查找 full_name 方法发生了什么。

> rails console
$> kevin = User.find(1)
$> kevin.full_name

然后目视检查您是否获得了全名,但这应该作为模型规范来完成。

希望对您有所帮助。很多关于测试的书我遇到的一个问题是,作者往往是这样的专家,因此不理解我们凡人真的需要了解你应该测试什么的基本前提。

关于ruby-on-rails - 使用 rspec rails4 进行简单的 Controller 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23188819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com