كيف يجب أن أقوم بتكوين الربيع والإسبات بحيث تتصل اختبارات التكامل الخاصة بي بسلوك تطبيق الويب بشكل صحيح؟

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

سؤال

لدينا تطبيق ويب استنادا إلى NSPring 1.2 و Nhibernate 2 واستخدام Hibernatetemplate. تم تكوين تطبيق الويب للاستخدام opensessionviewmodule..

في اختبارات التكامل لدينا ومع ذلك، تتميز جلسة السبات initdeperredclose. وبالنسبة للجزء الأكبر يعمل هذا جيدا على اختباراتنا. هناك بعض وظائف الخدمة التي تعمل بشكل جيد في سياق تطبيق الويب ولكن تفشل عند الاتصال من تسخير اختبار.

على سبيل المثال: لدي وظيفة واحدة تقوم بإنشاء وتحديث عدد من الكائنات ضمن معاملة. تتميز الوظيفة بسمة المعاملة ولكن لا يفشل الاختبار بالرسالة:

Illegal attempt to associate a collection with two open sessions

عند الاتصال من تطبيق الويب، اكتمال المعاملة بنجاح

كيف يجب أن أقوم بتكوين الربيع والإسبات بحيث تتصل اختبارات التكامل الخاصة بي بشكل صحيح في وظيفة تطبيق الويب بشكل صحيح؟

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

المحلول 2

لقد قمت بإعادة كتابة تركيبات اختبار التكامل الخاصة بي للترث من absracttransactionaldbproviderspringconttests. الطبقة المقدمة من إطار اختبار الربيع.

يعمل هذا بالفعل كل اختبار في معاملاته الخاصة مع التراجع (افتراضيا) في نهاية الاختبار. بصرف النظر عن حل مشكلة دورتين مفتوحتين، تشغيل اختباراتي أسرع بكثير (لا حاجة لمسح قاعدة البيانات في كل مرة).

نقطة مهمة أن تضع في الاعتبار عند استخدام إطار اختبار الربيع هو أنه من الضروري ضمان سياق تطبيق الربيع لرمز التطبيق وذلك من إطار الاختبار هو واحد وخلاف نفس المعاملة الخارجية والمعاملة الداخلية ستكون تم إنشاؤها بمصانع جلسة السبات المختلفة

نصائح أخرى

يجب عليك إنشاء مثيل ستيمسيون في جزء الإعداد من الاختبار ثم إغلاقه (بالتخلص) في النهاية (الدموع). هذا يجب أن يحاكي نموذج أوسيف جيدا. إليك عينة مبسطة:

using System;
using NHibernate;
using NUnit.Framework;
using Spring.Data.NHibernate.Support;

[TestFixture]
public class OsivKindOfTest
{
    private SessionScope scope;
    // get LocalSessionFactoryObject from somewhere
    // see Spring.Testing.NUnit and auto-injection
    private ISessionFactory sessionFactory;

    [SetUp]
    public void OnSetUp()
    {
        scope = new SessionScope(sessionFactory, null, true, FlushMode.Never, true);
    }

    public void TestSomething()
    {
        // just a dummy demo
        Console.WriteLine(sessionFactory.GetCurrentSession().Statistics.EntityCount);
    }

    [TearDown]
    public void TearDown()
    {
        if (scope != null)
        {
            scope.Dispose();
        }
    }
}

تتوقع هذه العينة أن LocalSessionObject ReboStressionAbject قد تم تعيينه

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