测试在设计上创建新用户

时间:2017-09-08 04:59:33

标签: ruby-on-rails rspec devise ruby-on-rails-5

我在api模式下使用Rails 5.1.3并使用设计进行身份验证。 我想做以下事情:

1 - 在创建新用户期间,创建一个名称为用户电子邮件的公司(另一个模型),并将该公司设置为用户公司 2 - 编写测试以验证此方案

为了实现第1项,我创建了自己的注册控制器并覆盖了create方法,如下所示:

def create
    super
    if @user.persisted?
      company = Company.new(name: @user.email, users: [@user])
      @company.save
    end
end

但我无法达到第2项。我会遇到几个不同的问题,这取决于我的工作。所以,我有一些问题:

a)我应该写一个控制器规格吗?看起来像这样并失败,因为得到200而不是201.但即使这样,我不确定设计是否真的创建用户:

describe "Create user" do
    it "Must create a company when creating user" do
      post :create, :params =>{user: {email: "f@x.com"}}
      expect(response).to have_http_status(:created)
    end
end

b)我应该写一个请求规范吗?看起来像这样并且失败的原因相同:获得200而不是201。

it "Must create a company when creating user" do
  post "/users", :params => {:user => {:email => "x@y.com"}}
  expect(response).to have_http_status(201)
end

c)我应该执行一些卷发来了解发生了什么吗?

curl -v -H "Accept: application/json" -H "Content-Type: application/json" -XPOST http://localhost:3000/users -d'{"user":{"email": "f@x.com"}}'

然后我收到了这个错误:

{"status":406,"error":"Not Acceptable","exception":"#\u003cActionController::UnknownFormat: ActionController::UnknownFormat

在我的服务器控制台上得到了这个:

Started POST "/users" for 127.0.0.1 at 2017-09-08 01:46:43 -0300
Processing by MyDevise::RegistrationsController#create as JSON
Parameters: {"user"=>{"email"=>"f@x.com"}, "registration"=>{"user"=>
{"email"=>"fuck@x.com"}}}
(0.6ms)  BEGIN
User Exists (1.6ms)  SELECT  1 AS one FROM `users` WHERE `users`.`email` = BINARY 'fuck@x.com' LIMIT 1
(0.4ms)  ROLLBACK
Completed 406 Not Acceptable in 39ms (ActiveRecord: 2.6ms)  
ActionController::UnknownFormat (ActionController::UnknownFormat):  
app/controllers/my_devise/registrations_controller.rb:4:in `create'

那么,我错过了什么?这是CSRF问题吗?我是否需要配置一些东西以便设计我的卷发工作?应该使用请求规范还是控制器规范?

我找到了一些关于如何在测试期间登录用户的示例,但是没有发现如何测试用户的创建。

请帮帮我。

谢谢

1 个答案:

答案 0 :(得分:0)

对于第一部分,我建议你不要污染控制器。相反,请使用before call_back

我假设has_manycompany

之间会有users关联

使用以下代码,您只需实现目标,而无需在控制器中编写单个代码

class User< ApplicationRecord     belongs_to:公司

before_create :associate_company

private def associate_company
  build_company(email: email)
end

类公司< ApplicationRecord     has_many:用户   端

现在进行测试,你只需测试你的模型, 您只需使用shoulda_matchers来测试before call_back

即可

注意*这样您就可以为每个用户创建一个新的compnay。这正是你想要的吗?

我希望这有效。