اختبار تحميل الملفات المصادقة في MERB
-
12-09-2019 - |
سؤال
هذا شيء يقودني إلى الجنون خلال الأيام القليلة الماضية. لدي إجراء يسمح للمستخدمين المصادقين لتحميل الأصول إلى الموقع. أعلم أن إجراء وحدة التحكم صحيحة حيث يمكنني تشغيل العملية يدويا ولكن أريد اختبارها باستخدام RSPEC.
لا بد لي من استخدام request
مساعد حتى أتمكن من إعادة استخدام جلسة مصادقة :given
لهذه المجموعة من الاختبارات.
it "should allow authenticated file uploads" do
file = File.open(a_valid_file)
mock_file = mock("file")
mock_file.stub!(:path).and_return(file.path)
request( resource(:assets), :method => "POST",
:params => { :file =>
{:tempfile => mock_file, :filename => File.basename(file.path)} }
)
end
إذا انتهت النقاط داخل المواصفات، فإن كل شيء يعمل بشكل جيد، ولكن عندما أقوم بتشغيل المواصفات وحاول الوصول إلى المسار في إجراء تحكم من خلال مصحح الأخطاء أحصل عليه:
e file[:tempfile].path
NoMethodError Exception: undefined method `path' for "#[Spec::Mocks::Mock:0x3fda2a4736c0 @name=\"file\"]":String
تخميني هو أن stub!(:path)
لا يتم تعيينه لأي كائن وهمية يبذله من خلال الطلب.
السؤال هو: هل سأذهب في الطريق الصحيح لاختبار تحميل الملفات وإذا لم يكن الأمر طريقة أخرى؟
المحلول
كنت أفعل ذلك خطأ. باستخدام request
كان يدعو إلى جميع المعلمات، لذلك تم تمرير كائن وهمي الخاص بي بأنه [المواصفات :: السخرط :: وهمية: 0x3fda2a4736c0name = " file "]. هذا سوف يعلمني أن أدفع المزيد من الاهتمام لإنتاج الاستثناء.
بدلا من ذلك يجب أن تستخدم multipart_post
وكء مكالمات المصادقة في كتلة.
it "should allow authenticated file uploads" do
file = File.open(a_valid_file)
multipart_post( resource(:assets), :method => "POST",
:params => { :file => file } ) do |controller|
controller.stub!(:ensure_authenticated).and_return(true)
controller.session.stub!(:user).and_return(User.first)
)
end