Am 25.02.2019 um 10:51 schrieb Jens W. Klein:
> On 24.02.19 08:48, Gerhard Schmidt wrote:> Hi,
>>
>> I'm writing a pyramid app using traversal and ZODB. Right now i writing
>> unit tests and try to test if the _p_changed attribute is set after a
>> method that changes a persistent object.
>>
>> The problem is that _p_changed is always False when running in the
>> testrunner. Even after I do obj._p_changed = True obj._p_changed is
>> still False.
>>
>> In running environment everything works fine. But I often forget the
>> self._p_changed = True after modifying lists or dicts inside a
>> persistent object. So i really like to test if it's get set.
>>
>> Is there a way to test if a persistent object would be saved when the
>> transaction is committed.
>
> _p_changed is meant as a trigger, but it is not meant to read a status.
> Triggering _p_changed joins the object to a transaction manager which
> then on commit saves the object.
In the normal code I don't read it, but for testing purposes it would be
quite handy.
> What your're looking for is probably _p_status which is "saved" or
> "unsaved".
it's always 'unsaved' while testing, because all objects are brand new
as the database is new for every test. Even after calling
transaction.commit() it's still unsaved. Is there a way to query the
transaction manager if a object is in the to be saved list.
> For dicts/lists Thierry is right, better use
> PersistentList/PersistentDict in order to not to have to trigger
> _p_changed manually.
For most purposes I use PersistenList/Dict, but first there is no
PersistentSet. PersistenList and PeristentDict (especial PeristentDicts
in a PersistentList) tend to fill the ZODB with many small objects and
remove other from the cache. So I use the not persistent ones when they
don't change often (most of the Time never) but even code that called
once a month or once a year has to be tested. And when _p_changed is not
used often the chance of forgetting increases and testing it is rather
useful.
Regards
Estartu