سؤال

هذا شيء يقودني إلى الجنون خلال الأيام القليلة الماضية. لدي إجراء يسمح للمستخدمين المصادقين لتحميل الأصول إلى الموقع. أعلم أن إجراء وحدة التحكم صحيحة حيث يمكنني تشغيل العملية يدويا ولكن أريد اختبارها باستخدام 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top