快速业务通道

Ruby on rails开发从头来(windows)(二十二)-测试Controller - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

Ruby on rails开发从头来(windows)(二十二)-测试Controller

时间:2011-12-02 博客园 Cure

上次测试Modeul的问题还没有解决,但是下面的还要继续,这次来测试Controller。

1.在test\functional目录下,rails已经为我们的controller生成了对应的测试文件,要注意application_controller不会生成测试文件。我们以控制登录的LoginController为例,打开login_controller_test.rb,内容如下:

require File.dirname(__FILE__) + ''/../test_helper''
require ''login_controller''
  
# Re-raise errors caught by the controller.class LoginController; def rescue_action(e) raise e end; end
  
class LoginControllerTest < Test::Unit::TestCase
def setup
@controller = LoginController.new
@request  = ActionController::TestRequest.new
@response  = ActionController::TestResponse.new
end
# Replace this with your real tests.def test_truth
assert true
end
end

我们看到,在setup方法里,定义了三个对象@controller和@request和@response,这样,我们就可以在不接入webserver或network的情况下进行测试了。

2.我们来把其中的test_truth方法替换成下面的代码:

def test_index
get :index
assert_response :success
end

其中,get方法模拟发出一个web请求,请求的action是index,并且捕捉响应(response),然后由assert_response断言来判断响应是否成功。

现在运行测试:depot>ruby test/functional/login_controller_test.rb

会看到测试失败了,命令行的输出:

Expected response to be a <:success>, but was <302>
1 tests, 1 assertions, 1 failures, 0 errors

Ruby on rails开发从头来(windows)(二十二)-测试Controller(2)

时间:2011-12-02 博客园 Cure

为什么会这样呢?回想一下,我们在前面的程序里,在访问index页面时,要先判断用户是不是管理员。如果不是,就要跳转到login页面,在login_controller.rb里:

before_filter :authorize, :except => :login

在application.rb文件里,有authorize方法:

def authorize
unless session[:user_id]
flash[:notice] = "Please log in"
redirect_to(:controller => "login", :action => "login")
end
end

3.好了,知道了原因,现在再写一个测试:

def test_index_without_user
get :index
assert_redirected_to :action => "login"
assert_equal "Please log in", flash[:notice]
end

上面的代码里,我们尝试请求index这个action,并且使用断言判断是否重定向到login,再判断flash[:notice]里的内容。

再次运行测试,命令行的输出如下:

Loaded suite test/functional/login_controller_test
Started
.Finished in 0.062 seconds.1 tests, 3 assertions, 0 failures, 0 errors

可以看到所有的断言都通过了。

但是还有一个问题,就是根据代码,我们只使用了两个断言,但是提示信息却显示有三个断言,这个问题是什么原因还不太清楚,但是现在并不影响我们继续下面的内容。

4.在我们的login页面上,用户输入名字和密码后,点击login按钮,这些信息将会发送个login这个action,然后创建一个User的实例来让用户登入。

在login_controller.rb里的login方法里:

@user = User.new(params[:user])
logged_in_user = @user.try_to_login

Ruby on rails开发从头来(windows)(二十二)-测试Controller(3)

时间:2011-12-02 博客园 Cure

现在,我们来测试login这个action,在login_controller_test.rb中添加方法:

de

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号