如何在设计sign_up操作后测试扩展功能?

时间:2012-07-01 22:19:31

标签: ruby-on-rails rspec devise

显然我有一个独特的情况,我无法在任何地方找到帮助。我正在尝试扩展我的注册过程,以便在我的数据库中创建额外的模型。这是我想要做的基本流程:

  • 用户注册电子邮件/密码(以及其他型号值)
  • 系统会创建“用户”模型
  • 系统会创建“个人资料”模型
  • 系统创建“公司”模型
  • 系统会创建一个“帐户”模型

最大的挑战是我正在使用Devise,而我似乎无法找到使用Rspec测试此功能的方法。这是一个简单的视图,我只是试图测试'注册'方法(工作:

describe "New Users" do
  describe "signing up" do
    it "should create a new user" do
      lambda do
        post :sign_up, :user => Factory.attributes_for(:user)
        response.should be_success
      end.should change(User, :count).by(1)
    end
  end
end

我收到以下错误:

1) UsersController New Users signing up should create a new user
 Failure/Error: post :sign_up, :user => Factory.attributes_for(:user)
 ActionController::RoutingError:
   No route matches {:user=>{:email=>"test@user.com", :password=>"secret", :password_confirmation=>"secret"}, :controller=>"users", :action=>"sign_up"}
 # ./spec/controllers/users_controller_spec.rb:14:in `block (5 levels) in <top (required)>'
 # ./spec/controllers/users_controller_spec.rb:13:in `block (4 levels) in <top (required)>'

设计路线按如下方式配置我的用户注册路线:

new_user_registration GET    /users/sign_up(.:format)  {:action=>"new", :controller=>"devise/registrations"}

我一直把头发拉出来,似乎在这方面找不到任何帮助。也许我接近它是错误的,但我想在初始注册表单上配置设置用户帐户的所有方面(即公司默认设置,配置文件设置等)。首先,我需要弄清楚如何测试注册过程。

提前致谢!

2 个答案:

答案 0 :(得分:1)

首先你要链接的路线是,因为设计使用POST方法进行注册:

user_registration POST   /users(.:format)                   devise/registrations#create

也许您可以尝试传递语法,例如:

it "should create a new user" do
expect {
  post :create, user: FactoryGirl.attributes_for(:user)
  response.should be_redirect
}.should change(User, :count).by(1)
end

修改 那么,我可能想出如何解决路线问题,我添加了一个新的控制器:

UsersController < Devise::RegistrationsController 

还添加了方法sign_up。然后在routes.rb中我添加了这段代码:

devise_for :users
devise_scope :user do
 post "/sign_up", :to => "devise/registrations#create"
end

最后在测试前进入测试线:

@request.env["devise.mapping"] = Devise.mappings[:user]

但我有验证问题,但我认为这是我的应用程序,因为我只是在现有系统的新分支中。希望它可以帮到你。尽管如此,我认为这种方法很常见或不常见。我宁愿选择recommended设计方法。您始终可以使用FactoryGirl创建用户依赖项,即link。希望它会对你有所帮助。

BTW Sry关于登录的无意义帖子:)我累了:))

答案 1 :(得分:0)

不是吗

post :users 

new_user_registration路由重定向到包含表单(new用户操作)的页面,而不是create用户操作。您应该在路线中找到类似的东西:

user_registration POST /users {:action => "create", :controller => "devise/registrations"}

检查rake routes