0

我正在查看这个答案以了解如何测试会话控制器并写了如下内容:

require 'spec_helper'

describe SessionsController do
  context "We should login to the system and create a session" do
    let :credentials do
      {:user_name => "MyString", :password => "someSimpleP{ass}"}
    end

    let :user do
      FactoryGirl.create(:user, credentials)
    end

    before :each do
      post :create , credentials
    end

    it "should create a session" do
      puts user.inspect
      puts session[:user_id]
      #session[:user_id].should == user.id
    end
  end
end

基于此,我创建了一个工厂女孩用户:

FactoryGirl.define do
  factory :user, :class => 'User' do
    name "sample_user"
    email "MyString@gmail.com"
    user_name "MyString"
    password "someSimpleP{ass}"
  end
end

现在一切正常 - 声明的 exceot before :each do- 它从不“记录”“用户” - 因此我无法测试控制器的功能,是否正确创建了会话?

现在大多数人会说,使用 capybara 并通过这种方式对其进行测试——但这是错误的,IMO——确定我是否正在进行前端测试,但我正在测试基于控制器的逻辑。有人能告诉我为什么这不起作用吗?路由工作正常。

当它不应该出现时,我puts session[:user_id]的出现为零

4

2 回答 2

2

let被懒惰地评估,即使对于子句,所以在您登录before时尚未创建用户。post如果您更改为 using let!,您将避免此问题。

于 2013-09-02T18:11:31.237 回答
1

您误解了 SessionsController 和 RegistrationsController。

Session 是给已经注册的用户的,不是用来创建用户的。SessionController 中的#create 表示创建会话,而不是用户。

RegistrationController 用于创建具有完整详细信息的用户,包括密码确认。

要测试 SessionsController,首先需要在 FactoryGirl 中创建一个有效用户,然后使用他的凭据(例如电子邮件和密码)登录。

于 2013-09-02T01:51:23.270 回答