繁体   English   中英

Rails 3.1 Rspec Rails 2-如何测试此控制器操作?

[英]Rails 3.1 Rspec Rails 2 - How can I test this controller action?

我需要知道如何测试此控制器动作

  def create_mobile
      if mobile_user = MobileUser.authenticate(params[:email], params[:password])
        session[:mobile_user_id] = mobile_user.id
        respond_to do |format|
          format.json { head :ok }
        end
      else
        respond_to do |format|
          format.json { head :unauthorised }
        end
      end
  end

该路线是对sessions / create_mobile的发布请求,您可以看到该操作仅响应json

我当前的控制器规格看起来像这样

describe SessionsController, "Logging in" do

  before(:each) do
    @mobile_user = FactoryGirl.create(:valid_mobile_user)
  end

  it "Should log in mobile user" do
    @request.env["HTTP_ACCEPT"] = "application/json"
    post :create_mobile, {:password => @mobile_user.password, :email => @mobile_user.email}
    response.should be_success
  end

  it "should fail log in mobile user" do
    @request.env["HTTP_ACCEPT"] = "application/json"
    post :create_mobile, {:password => 'joe', :email => @mobile_user.email}
    response.should_not be_success
  end

结束

测试结果在

  1) SessionsController Logging in should log in mobile user
     Failure/Error: response.should be_success
       expected success? to return true, got false
     # ./spec/controllers/sessions_controller_spec.rb:11:in `block (2 levels) in <top (required)>'

因此,我的应用程序代码有问题,或者我的测试代码有问题,但是无论哪种方式,随着MobileUser模型规范的通过,authenticate方法都没有问题,看起来像这样

  it "should authenticate" do
    mu = FactoryGirl.create(:valid_mobile_user)
    assert_equal 1, MobileUser.count
    assert_equal mu, MobileUser.authenticate(mu.email, mu.password)

  end

非常感谢您对解决此问题的任何帮助。 提前致谢

更新如下所示,使用

post :create_mobile, {:password => 'joe', :email => @mobile_user.email} :format => :json

或使用

@request.env["HTTP_ACCEPT"] = "application/json"

或两者的结合没有区别

更新2该测试刚刚开始工作,无缘无故(我从来不明白为什么它最初没有工作)。 完全奇怪!

我最近遇到了同样的问题。 下面是我的测试代码

post :create, :login => 'mock_user', :password => 'passwd', :format => :json

expected = {
    :login => 'mock_user'
}.to_json

session[:user_id].should == mock_user.id
response.body.should == expected

由于响应导致测试结果为假。正文为空。 我检查了test.log,发现控制器中出现406无法接受的请求错误。 大量搜索后,我改为:format =>'json'。 然后我得到了预期的测试结果。

由于您尝试将JSON发布到控制器,因此您不应该将哈希转换为JSON吗?

post :create_mobile, {:password => 'joe', :email => @mobile_user.email}.to_json

如果不想在代码中添加七个字符只是为了看看它是否有效,则应将参数输出到记录器以查看它们的外观。

def create_mobile
  logger.info "LOGIN PARAMS U/N: #{params[:email]}, P/W: #{params[:password]}"
  ...

然后使用tail -f log / test.log查看您的控制器在测试期间的外观。

您是否尝试过在post语句中添加:format选项

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM