保存された IEnumerable はデバッグの再起動で消えますが、1 つの単体テストで 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));
}

Web サイトで同じメソッド (AddUser と GetUser) を「デバッグの再開」で区切って使用すると、GetUser() は IUser を正しく返しますが、 Roles.Count() == 0

役に立ちましたか?

解決

1 つの問題として考えられるのは、 更新デフ. 。テストでは、新しく作成した IUser を使用し、それに .AddRole() を使用します。したがって、すべてがうまくいきます。ただし、既存の IUser で .AddRole() を呼び出すとすぐに、update-deph が関連します。
デフォルトでは、IObjectContainer.Store() に渡されたオブジェクトのみが更新されます。参照されているすべてのオブジェクトは更新されません。リストもオブジェクトなので更新されません。したがって、次の可能性があります。

それが問題でない場合は、教えてください。この回答は削除します。

ところで。使用している db4o バージョン (7.4) の Guid-Handling は最適ではありません。おそらく、新しいバージョン 7.12 を検討する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top