هل من المهم التعامل مع التخزين المؤقت للاستعلام في اختبارات وحدة ActivereCord؟

StackOverflow https://stackoverflow.com/questions/2315853

سؤال

في عالم السبات ، يمكنك في كثير من الأحيان إجراء اختبارات للوحدة التي يبدو أنها تمر ولكن هناك بالفعل أخطاء لا تظهر لأنك تتعامل مع البيانات المخزنة مؤقتًا. على سبيل المثال ، يمكنك إنقاذ أحد الوالدين مع أطفاله يفكرون في أنه يتسلل إلى الإنقاذ. إذا قمت بإعادة الاستعداد للوالد بعد حفظ واختبار حجم مجموعة الأطفال ، فإنه يبدو جيدًا. ولكن في الواقع لم ينقذ السبات الأطفال ولكنه قام بتزييف الوالد حتى تنظر إلى الأطفال غير المحفوظين. تتمثل إحدى طرق الالتفاف على هذا في مسح ذاكرة التخزين المؤقت للجلسة بين الحفظ والاستعلام حتى تعرف أن البيانات تأتي مباشرة من قاعدة البيانات.

هل هذه قضية مع ActivereCord؟ إذا قمت بحفظ طراز ثم استعنيه في نفس الاختبار ، فهل من الممكن ألا أحصل على البيانات من قاعدة البيانات ولكن من ذاكرة التخزين المؤقت للاستعلام؟ لم أر أي اختبارات عينة تحاول التعامل مع هذا ، لذا فأنا أتساءل عما إذا كان هناك شيء يجعلها غير قضية؟

هل كانت مفيدة؟

المحلول

نعم. اعتمادًا على كيفية كتابة اختباراتك ، يمكن أن تتداخل ذاكرة التخزين المؤقت للاستعلام في Rails في بعض الأحيان. في بعض الأحيان تكون القضبان ذكية بما يكفي لتتبع متى تحتاج ذاكرة التخزين المؤقت (عندما يكون هناك ارتباط واضح بين الكائنات) ، ولكن هنا مثال لا يتصرف كما هو متوقع:

user.posts.should == []
Post.create(:user_id => user.id)
user.posts.size.should_not == [] # Fails, since the original query was cached.

بشكل عام ، إذا كنت تقوم بتنفيذ نفس الاستعلام مرتين في نفس الاختبار ، فعليك الاتصال. التحميل على البيانات قبل محاولة تنفيذ الاستعلام الثاني. مثل ذلك:

user.posts.should == []
Post.create(:user_id => user.id)
user.posts.reload
user.posts.size.should_not == []

في تجربتي الشخصية ، من الأفضل النظر في طريقة مختلفة لكتابة الاختبار عن استخدام الطريقة أعلاه. على سبيل المثال ، إليك طريقة أفضل لكتابة ما سبق لن يتأثر بذاكرة التخزين المؤقت للاستعلام:

lambda { Post.create(:user_id => user.id) }.should_change(user.posts, :count).by(1)

نصائح أخرى

لم أواجه هذا أبدًا كمسألة مع ActivereCord. ما أفهمه هو أن ذاكرة التخزين المؤقت هي فقط في القراءات ، لذلك يتم تنفيذ حفظ دائمًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top