【问题标题】:Ruby on Rails: Execute POST from rake taskRuby on Rails:从 rake 任务执行 POST
【发布时间】:2014-03-29 21:46:23
【问题描述】:

我想使用 rake 任务在我的数据库中播种一些用户数据以进行手动测试。由于我的表和业务逻辑的复杂性,对我来说最简单的方法是从 rake 任务执行 POST 到我的 user_controller。使用 RSpec(和 FactoryGirl)我可以做到

   describe "POST create" do
        it "registers a new user" do
            @request.env["devise.mapping"] = Devise.mappings[:user]
            user = attributes_for(:user)
            response = post( :create, user: user)
            response.status.should eql(200)
        end
    end

如何在我的 rake 任务中使用“post”助手?

【问题讨论】:

  • 将您的控制器调用的代码放在“服务”类中的 post 操作中,在 rake 任务中新建一个并调用其上的方法。

标签: ruby-on-rails-4 rake


【解决方案1】:

创建一个lib/tasks/seed_post.rake文件名无所谓

并把下面的代码放进去

namespace :seed do
  task :posts => :environment do
    50.times do |i|
      # it's your own problem to generate the following user, params so that it works
      Post::CreationService.perform(user, params)
    end
  end
end

现在您可以使用.. rake seed:postszeus rake seed:postsbundle exec rake seed:posts 调用任务,具体取决于您使用的是 zeus 还是 bundler 或其他...

真正重要的是你的电话应该是

rake namespace_you_defined:task_name_you_defined

你也必须改变控制器创建成为

def create
  @post = Post::CreationService.perform(current_user, post_params)
  # instead of this old code i'm assuming you are using
  @post = current_user.posts.create!(post_params)
  ...
end

也添加一个这个文件

# app/services/post/creation_service.rb
class Post::CreationService
  def self.perform(current_user, params)
    current_user.posts.create!(params)
   end
end

【讨论】:

  • 这很有帮助,谢谢,但我不知道如何发布。我可以在我的 rake 任务中包含测试助手吗?
  • 我猜这是不可能的……但是如果你熟悉服务对象……你可以将控制器中的POST #create转换为服务对象并在rake任务中使用它跨度>
  • @BradUrani 我已经编辑了答案..希望它可以帮助一点点......因为我不知道你的逻辑或控制器到底长什么样。
  • 原来我在这个问题中真正想做的并不是一个好主意。这要好得多。我恰好正在重构一个带有臃肿控制器的项目,并且一直在寻找捷径,直到我可以真正重构它
  • 我重构控制器的方式叫做service object模式。您可以阅读更多相关信息
最近更新 更多