يختفي IEnumerable المخزن عند إعادة تشغيل التصحيح، ولكن إعادة إنشاء IObjectServer وIObjectClient في اختبار وحدة واحدة أمر جيد

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

  •  20-09-2019
  •  | 
  •  

سؤال

أقوم بتخزين كائن IUser في قاعدة بيانات Db4o على النحو التالي (العميل هو IObjectClient):

public Guid AddUser(IUser user)
{
    lock (userLock)
    {
        user.Id = Guid.NewGuid();
        client.Store(user);
        client.Commit();
    }
    return user.Id;
}

يحتوي تطبيق IUser المستخدم هنا على الحقل الموضح في IUser IEnumerable<Roles> Roles { get;} نفذت مع حقل الدعم IList<Roles> = new List<Roles>()

عندما أقوم بتشغيل UnitTest التالي، كل شيء يعمل بشكل جيد:

[TestMethod]
public void UserStaysInRoleAfterServerRestart()
{
    string filePath = IOHelper.MakeAbsolute(ConfigurationManager.AppSettings["userRepository.path.db4o"] + "1");
    IUser expected = GenerateTestUser();
    expected.AddRole(Roles.Anonymous);
    IObjectServer userServer1 = Db4oFactory.OpenServer(filePath, 0);
    IUserRepository repo = new UserRepository(userServer1);
    repo.AddUser(expected);
    userServer1.Close();

    IObjectServer userServer2 = Db4oFactory.OpenServer(filePath, 0);
    IUserRepository repo2 = new UserRepository(userServer2);
    IUser actual = repo2.GetUser(expected.Id);
    Assert.IsTrue(actual.IsInRole(Roles.Anonymous));
}

عندما أستخدم نفس الطرق (AddUser وGetUser) في موقع الويب الخاص بي، مفصولة بـ "إعادة تشغيل تصحيح الأخطاء"، ومع ذلك، يقوم GetUser() بإرجاع IUser بشكل صحيح، ولكن مع Roles.Count() == 0

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

المحلول

قضية واحدة يمكن أن تكون عمق التحديث.في الاختبار الخاص بك، يمكنك استخدام IUser جديد تم إنشاؤه واستخدام .AddRole() عليه.لذلك كل شيء يعمل بشكل جيد.ومع ذلك، بمجرد استدعاء .AddRole() على IUser موجود، يصبح التحديث ذو صلة.
افتراضيًا، يتم تحديث الكائن الذي تم تمريره إلى IObjectContainer.Store() فقط.لا يتم تحديث كافة الكائنات المشار إليها.وبما أن القائمة هي أيضًا كائن، فلا يتم تحديثها.لذلك لديك هذه الاحتمالات:

إذا لم تكن هذه هي المشكلة، أخبرني وسأقوم بإزالة هذه الإجابة.

بالمناسبة.أنا الإصدار db4o الذي تستخدمه (7.4) لديه معالجة توجيهية دون المستوى الأمثل.ربما عليك أن تفكر في الإصدار الأحدث، 7.12.

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