2016-08-04 11 views
2

Ich habe eine Controller-Spezifikation für meine Anwendung, die die create-Methode auf einem Controller testet. Die Erstellungsaktion funktioniert zwar einwandfrei, aber die Spezifikation schlägt fehl. Es scheint, dass es den Hash-POST-Parameter automatisch in eine Zeichenfolge konvertiert.RSpec Controller Test Konvertieren von Hash in String

let(:coupon) { attributes_for(:coupon) } 

describe 'POST #create' do 
    it 'should create a new coupon from params' do 
    expect { 
     post :create, :coupon => coupon 
    }.to change(Coupon, :count).by(1) 
    end 
end 

Wenn ich jetzt puts coupon tun, ist es eine gültige Hash von Daten zu erzeugen, und der Typ ist Hash. Aus irgendeinem Grund erhält der Controller eine Zeichenfolge für params [: coupon]. Nur beim rspec-Test passiert das, wenn ich das Browsen mit einem POST-Formular durchführe, funktioniert das einwandfrei.

Rspec wirft die folgende Meldung:

NoMethodError: 
    undefined method `permit' for #<String:0x00000005062700> 
    Did you mean? print 

und wenn ich puts params[:coupon].class in der Steuerung in rspec tun gibt es mir String. Warum könnte es meinen Hash in eine Zeichenfolge für die POST-Anfrage konvertieren, und wie kann ich das verhindern?

Ich bin mit Rails 5.0.0 und 3.5.1 rspec

Antwort

0

Es scheint, dass es ein Problem mit dem Edelsteine ​​war irgendwie open_taobao meine Post-Anfragen in Tests zu verwandeln.

1

Dieses genau das gleiche Verhalten in letzter Zeit für mich auftauchten, wenn ein JSON-API-Endpunkt zu testen. Ursprünglich hatte ich das als mein Thema:

subject { put :my_endpoint, **input_args } 

und ein Integer-Wert in input_args wurde in einen String übersetzt zu werden. Das Update war format: 'json' als zusätzliches Schlüsselwort-Argument hinzufügen, um put:

subject { put :my_endpoint, **input_args, format: 'json' } 
+0

Leider hat dies nicht behoben, und ich habe bereits versucht, es mit verschiedenen JSON-Funktionen zu testen. Mein gesamter Gutschein-Hash wird in eine Zeichenfolge umgewandelt. In der Steuerung, wenn params.require (: coupon) verwendet wird, erhält es einen String und nicht einen Hash, so dass es nicht auf einen der Hash-Werte zugreifen kann. –