2017-09-08 3 views
0

Ich verwende Rails 5.1.3 im API-Modus und benutze Gerät zur Authentifizierung. Ich möchte folgendes tun:Testen, um einen neuen Benutzer auf dem Gerät zu erstellen

1 - Während der Erstellung eines neuen Benutzers, erstellen Sie ein Unternehmen (ein anderes Modell) mit den Namen der Benutzer E-Mail zu sein und setzen diese Firma als das Unternehmen des Benutzers 2 - a schreiben Test dieses Szenario

um zu validieren Artikel # 1, zu erreichen, ich meine eigene Registrierungen Controller erstellen und überschreiben die Methode erstellen, die wie folgt aussehen:

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

Aber ich bin nicht in der Lage Einzelteil zu erreichen # 2. Ich habe verschiedene Probleme, je nachdem, was ich mache. Also, ich habe ein paar Fragen:

a) Sollte ich eine Controller-Spezifikation schreiben? Sieht aus wie diese und schlägt fehl, da ein 200 statt 201. Aber auch diese Art und Weise erhalten, I`m nicht sicher, devise wirklich schafft den Benutzer:

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

b) Soll ich eine Anfrage spec schreiben? Sieht aus wie diese und nicht mit dem gleichen Grund: bekommt eine 200 statt 201.

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

c) Sollte ich einige Locken ausführen zu verstehen, was los ist?

curl -v -H "Accept: application/json" -H "Content-Type: application/json" -XPOST http://localhost:3000/users -d'{"user":{"email": "[email protected]"}}' 

Dann habe ich diesen Fehler:

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

Und bekam diese auf Konsole meines Servers:

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"=>"[email protected]"}, "registration"=>{"user"=> 
{"email"=>"[email protected]"}}} 
(0.6ms) BEGIN 
User Exists (1.6ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY '[email protected]' 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' 

Also, was ich fehle? Ist es ein CSRF-Problem? Muss ich etwas konfigurieren, um mit meinen Locken arbeiten zu können? Soll die Anforderungsspezifikation oder die Controller-Spezifikation verwendet werden?

Ich habe einige Beispiele gefunden, wie man Benutzer während der Tests anmeldet, aber nichts gefunden, wie man die Erstellung eines Benutzers testet.

Bitte helfen Sie mir.

Danke

+0

Sie erhalten 406, weil Sie eine JSON-Antwort anfordern, diese jedoch nicht im Controller definiert haben. Nicht sicher über das HTTP 200 hier. Sie können jedoch einige andere Matcher ausprobieren, um festzustellen, ob der Benutzer erstellt wird, z. 'expect (assigns (: user)) .be_persisted' – EJ2015

+0

In diesem Ausschnitt sieht es aus, als wäre es ein Problem, aber ich habe dies während meiner Versuche im Controller geändert und nicht funktioniert. –

Antwort

0

Für den ersten Teil, würde ich Ihnen vorschlagen Controller nicht zu verschmutzen.Verwenden Sie stattdessen eine vor CALL_BACK

ich dort gehe davon wird

Mit folgendem Code eine has_many Assoziation zwischen company und users sein können Sie einfach Ihr Ziel erreichen, ohne ein einziges Stück Code in Controller

Klasse zu schreiben Benutzer < ApplicationRecord belongs_to: Firma

before_create :associate_company 

private def associate_company 
    build_company(email: email) 
end 

Ende

Klasse Firma < ApplicationRecord has_many: Benutzer Ende

nun für die Prüfung, müssen Sie nur noch Ihre Modelle testen, können Sie einfach shoulda_matchers verwenden für eine before call_back

Hinweis Testen * Auf diese Weise Sie erstellen ein neues Compnay für jeden Benutzer. Ist das genau das, was du willst?

Ich hoffe, das funktioniert.

Verwandte Themen