Testing Queries on Google App Engine Datastore
In an attempt to prevent duplicate entities in the Datastore, you're facing difficulties testing a query function that must ensure uniqueness. Despite the function performing correctly in the application, tests repeatedly fail.
Upon investigating the issue, it has been determined that accessing datastore data through queries is not possible within the testing context. This inability stems from the fact that Datastore transactions are not committed immediately, resulting in inconsistent query results.
By introducing a delay of at least 100ms between the datastore.Put() and q.GetAll() operations in the test case provided, the tests will pass. This is because the delay allows for the transaction to be committed, ensuring data consistency.
To ensure strong consistency without relying on delays, you can use the StronglyConsistentDatastore: true option when creating the test context. By doing so, all queries will be strongly consistent, guaranteeing that data is immediately accessible after write operations.
Here's an updated version of your test case using the StronglyConsistentDatastore option:
type Entity struct { Value string } func TestEntityQuery(t *testing.T) { c, err := aetest.NewContext(nil) if err != nil { t.Fatal(err) } defer c.Close() c.StronglyConsistentDatastore = true key := datastore.NewIncompleteKey(c, "Entity", nil) key, err = datastore.Put(c, key, &Entity{Value: "test"}) if err != nil { t.Fatal(err) } q := datastore.NewQuery("Entity").Filter("Value =", "test") var entities []Entity keys, err := q.GetAll(c, &entities) if err != nil { t.Fatal(err) } if len(keys) == 0 { t.Error("No keys found in query") } if len(entities) == 0 { t.Error("No entities found in query") } }
The above is the detailed content of How Can I Reliably Test Datastore Queries in Google App Engine?. For more information, please follow other related articles on the PHP Chinese website!