2013-08-02 5 views
4

Nous sommes en train de passer à RavenDB 2.5 et nous nous sommes retrouvés dans une situation particulière. Un de nos tests unitaires échoue soudainement, et pour aucune raison évidente.Bug possible dans RavenDB EmbeddableDocumentStore

Voici un code simple à reproduire le problème:

class Foo 
{ 
    public Guid Id { get; private set; } 
    public DateTime? ExpirationTime { get; set; } 

    public Foo() 
    { 
     Id = Guid.NewGuid(); 
     ExpirationTime = null; 
    } 
} 

var documentStore = new EmbeddableDocumentStore 
    { 
     RunInMemory = true, 
     Conventions = { DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites } 
    }; 
documentStore.Initialize(); 

using (var session = documentStore.OpenSession()) 
{ 
    session.Store(new Foo()); 
    session.Store(new Foo()); 
    session.SaveChanges(); 
} 

Donc, maintenant nous avons deux documents dans la base de données, à la fois avec ExpirationTime = null. C'est ce qui se passe lors de l'interrogation de la base de données pour ces documents:

using (var session = documentStore.OpenSession()) 
{ 
    var bar = session.Query<Foo>().Where(foo => foo.ExpirationTime == null).ToList(); 
    Console.WriteLine("1. Number of documents: {0}", bar.Count); 

    bar = session.Query<Foo>().Where(foo => foo.ExpirationTime == null || 
            foo.ExpirationTime > DateTime.Now).ToList(); 
    Console.WriteLine("2. Number of documents: {0}", bar.Count); 

    bar = session.Query<Foo>().Where(foo => foo.ExpirationTime == null | 
            foo.ExpirationTime > DateTime.Now).ToList(); 
    Console.WriteLine("3. Number of documents: {0}", bar.Count);   
} 

La sortie de ces requêtes sont les suivantes:

1. Number of documents: 2 
2. Number of documents: 0 
3. Number of documents: 2 

Cela ne semble pas correct pour moi ... J'attends aussi le numéro 2. pour donner 2.

J'ai couru les mêmes questions contre un serveur de RavenDB, et ai obtenu les résultats prévus, ainsi il semble que ceci soit un problème avec le EmbeddableDocumentStore. Pendant le test, j'ai également trouvé un comportement étrange lors de l'utilisation de l'opérateur logique ou dans d'autres cas. Parfois, l'utilisation de foo.HasValue donne un résultat différent de foo != null, mais cela peut être lié au même problème.

Toute personne ayant déjà rencontré ce problème? Bug connu?

+0

[RavenDb: Force les index à attendre jusqu'à ce qu'ils ne soient pas périmés pendant les tests unitaires] (http://stackoverflow.com/questions/10316721/ravendb-force-indexes-to-wait-until-not- stale-while-unit-testing) Est-ce que ce pourrait être quelque chose avec un «index périmé»? – NoLifeKing

+0

@NoLifeKing Je ne l'ai pas montré dans le code d'exemple, bu j'utilise toujours 'DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites' ou' WaitForNonStaleResultsAsOfLastWrite() 'lors du test unitaire. Cela a également fonctionné comme prévu avant de passer à Raven 2.5. –

+1

S'il vous plaît envoyer un test unitaire défaillant à la liste de diffusion –

Répondre

3

C'était un bug dans RavenDB lié au tri des champs null. Fixé dans la version suivante