Gene Campbell wrote: > Hello Djangonauts > > I'm a noob on both Django and Python, so this question might be easy > for the experts out there. I am trying to do test first development > during the development of my model code. (I have lots of experience > with test first coding in the Java world, no practical experience in > the Py world.) > > I want to do something like this > > class ModelTest(TestCase): > > def test_crud_modelone(self): > mo = ModelOne( name="A name" ) > mo.save() > > saved_mo = mo.objects.get(pk=mo.id) > > assertEqual( vars(mo), vars(saved_mo),"Something not getting saved") > > That assertEqual line fails. I wrote this > > def compare(self, obj1, obj2, verbose = False): > other = vars(obj2) > for d,v in vars(obj1).items(): > if isinstance(other.get(d,None),datetime.date): > if not other.get(d,None) == v.date(): > return False > elif not other.get(d,None) == v: > return False > > return True > > This is probably horrible python, I'm still learning (unlearning > Java), but it compares correctly for strings and dates so far that > I've tested. I've been using python since 1.5, I had to look up what vars() did. Probably not idiomatic Python. (I've always just looked at __dict__ directly, which I do rarely).
The assertEqual line (probably) fails because the order of dictionary keys is not defined. > Some might be asking why I'm testing if my models can be saved, as > most of that functionality is tested when Django is tested. But, I > still feel there's a enough that I have to write to warrant a simple > sanity test like this. FWIW I believe testing what you're testing is a waste of time and violates unit testing. Really the db should be mocked, but that is fairly hard. If you didn't write save(), you shouldn't be testing it. But, if I were testing this I think I'd do something like this assertEqual( db_mo, mo, "local and db versions of %s not identical" % mo.__class__) In general, I trust == (either Python's or the object's author's) more than poking into the internals of an object, encapsulation and all that :) When I compare dictionaries I either convert them to sorted tuples (to put keys in proper order) expected = dict(var1="dog", var2="cat") answer = something_that_return_dict() assertEqual( sorted(expected.items()), sorted(answer.items()) ) Or check only certain keys are equal (for instance if the answer dict has other stuff in it I don't care about) check_these = ["key1", "key3"] # = expected_dict.keys() answer = something_that_return_dict() for k in check_these: self.assertEqual( expected_dict[k], answer[k], "expected[%(key)s] != answer[%(key)s]" % {"key":k} ) For Models in which I write a custom save method this is how I usually structure it. def save(self): if self.value is None: self.value = self._calc_value() super(FooModel, self).save() def test_value_on_save(self): test_data =( (dict(foo="", bar=""), 42 ), (dict(foo="1", bar="3"), 37 ), # test more edge cases, etc. ) for (expected, data) in test_data t = Model(**data) t.save() self.assertEqual( expected, t.value ) If I had another custom value I'd write another test for it. Good luck with your continued Python adventures, -- Norman J. Harman Jr. Senior Web Specialist, Austin American-Statesman ___________________________________________________________________________ You've got fun! Check out Austin360.com for all the entertainment info you need to live it up in the big city! --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---