On Thu, Feb 5, 2015 at 10:53 AM, Carl Meyer <[email protected]> wrote: > Hi Larry, > > On 02/05/2015 06:57 AM, Larry Martell wrote: >> On Thu, Feb 5, 2015 at 7:29 AM, Jani Tiainen <[email protected]> wrote: >>> On Tue, 3 Feb 2015 19:38:31 -0500 >>> Larry Martell <[email protected]> wrote: >>> >>>> I have a django app that uses a temp table. In the real world this is >>>> no issue, as each invocation of the app runs in its own MySQL session >>>> so there cannot be any conflict with the temp tables. But in my tests >>>> there are multiple requests sent, and apparently they are all in the >>>> same session, as on the second request I get an error because the temp >>>> table already exists. I tried logging out between requests, and I >>>> tried creating a new Client instance for each request, but I still got >>>> the error. Then I tried deleting the Client object, but I got Client >>>> object has no attribute __del__. >>>> >>>> What I can do so that each request in a test has its own MySQL session? >>> >>> >>> Instead of Django standard TestCase (which internally wraps all in single >>> transaction and makes transactions as a no-op), you should use >>> TransactionalTestCase. >>> >>> https://docs.djangoproject.com/en/1.7/topics/testing/tools/#transactiontestcase >> >> Thanks for the reply Jani. We're using 1.5 and I don't think this is >> available in that version. We'll probably be moving to 1.6 soon >> though, and it is there. > > TransactionTestCase has been around for quite a long time (since 1.1, > IIRC). It's definitely in 1.5.
I thought it was not in 1.5 because I went to https://docs.djangoproject.com/en/1.5/topics/testing/tools/#transactiontestcase and got a 404. >> But I'm not sure how this will be useful to >> me. The docs say "A TransactionTestCase resets the database after the >> test runs by truncating all tables." My test code is something like >> this: >> >> # load test data >> # login >> response = self.client.get('...') >> self.assertEqual(response.status_code, 200) >> # collect results >> >> response = self.client.get('...') >> self.assertEqual(response.status_code, 200) >> # collect results >> >> and so on. I need the temp table to get dropped between each get call. >> The best way to do this is if each is in its own MySQL session. Having >> the table truncated doesn't really accomplish this. I think I will >> have to modify the code to drop the temp table after it's used. I hate >> to muck with working production code to accommodate a test, but I also >> don't want the test branch to have a different code base from the >> production branch. I'll probably go with the former option. > > I agree, I don't think TransactionTestCase will help with this situation. > > I find the production design a bit questionable, Why do you say that? I recently added the temp table for performance. I have a query that was taking over an hour. When I broke it into 2 queries using a temp table it then ran in 10 seconds. If I've introduced something bad in my app, I'd really like to know about that. > but taking it as a > given that it meets your needs adequately and you don't want to change > it, you could also address this problem by simply dropping the temp > table in a tearDown() method, no? A tearDown() method would be run after the test, right? I am sending multiple requests within one test. Thanks! -larry -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CACwCsY6vpCE3Pmhq4V-tOFwHPFAbNNzYRA_1uM5iiSMzCLyCzw%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

