2011-05-19 38 views
0

我创建用户的方法在users_controller.rb看起来像创建一个测试:Rspec的控制器测试,尝试以“processlogin”行动

def process_login 
    is_login_valid(params[:user][:user_name], params[:user][:password]) 

    if logged_in? 
     redirect_to root_url 
    else 
     @user = User.new(params[:user][:user_name] 
     redirect_to :action => 'login' 
end 

我有什么当前:

describe UsersController do 
    describe "Post 'process_login'" 
    it "should be successful" do 
     post 'process_login' 

     response.should be_success 
    end 
    end 

end 

的方法is_login_valid和logged_in?都包含在application_controller中,并且是来自我的/ lib文件夹中的一个ruby类的方法,名为LoginSystem.rb

我的测试失败了,因为它没有正确地嘲弄事情,这是我第一次这样做希望有人能帮助我。

错误消息:

UsersController POST 'process_login' should be successful 
    Failure/Error: post 'process_login' 
    NoMethodError: 
     You have a nil object when you didn't expect it! 
     You might have expected an instance of ActiveRecord::Base. 
     The error occurred while evaluating nil.[] 
    # ./app/controllers/users_controller.rb:11:in `process_login' 
    # ./spec/controllers/users_controller_spec.rb:21 
+0

你的问题是什么? – 2011-05-19 17:11:36

+0

我更新了q,我需要测试通过。 – Blankman 2011-05-19 17:12:37

+0

如果您提供错误消息,它可能会有所帮助。 – 2011-05-19 17:13:45

回答

2

啊,感谢您的错误消息。我假设第11行是is_login_valid(params[:user][:user_name], params[:user][:password])。因为你没有发送任何参数在你的测试后params [:user]是零因此为零。[]错误(当控制器正在寻找参数[:user] [:user_name])时,你设置了通过将它们作为第二个参数作为散列传递给测试中的参数。

+0

啊,所以我要为此创建一个存根或只传入一个虚拟散列?这个怎么做? – Blankman 2011-05-19 17:37:53

+0

好吧,这解决了散列问题,现在它似乎是重定向到页面,如果登录失败,即使我有seeting logged_in?为真。 – Blankman 2011-05-19 17:56:14

+0

好的我在'帖子'后面有存根,但它必须被剥掉b4。谢谢克里斯! – Blankman 2011-05-19 18:02:44

0

我相信:你想要去的,如果我理解正确

controller.stub(:is_login_valid} { true } 

应该得到你。

1

我觉得你确实需要

controller.stub(:logged_in?) { true } 

或者,如果你想测试的LOGGED_IN方法实际上是被称为

controller.should_receive(:logged_in?).and_return(true) 

第2版本将导致测试失败,除非方法logged_in?被称为一次且仅一次

如果您收到错误消息,您可能还需要@jaydel建议的controller.stub(:is_login_valid} { true }有关此方法的消息也丢失了