2013-09-04 7 views
1

Я изо всех сил пытаюсь написать модульные тесты для Python, которые используют Pyodbc для запроса локальной базы данных SQL Server.Использование pyodbc в модульных тестах

Следующий код работает ...

import pyodbc 
import random 
import unittest 
from EmailSender import EmailSender 

class TestSequenceFunctions(unittest.TestCase): 

    def setUp(self): 
     self.email_sender = EmailSender() 
     self.other_email_sender = EmailSender() 

    def test_for_initialisation_variables(self): 
     """ 
     Tests to check that the object is created properly 
     """ 
     self.assertTrue(self.email_sender.server) 
     self.assertTrue(self.email_sender.errorLogFile) 
     self.assertTrue(self.email_sender.connection) 
     self.assertTrue(self.email_sender.cursor) 
     self.assertTrue(self.email_sender.siteAuth) 
     self.assertTrue(self.email_sender.apiCallsLimitPerRun) 

    def test_SQL_Server_Connection(self): 
     for value in self.email_sender.cursor.execute("select * from sys.tables"):. 
      print value 

Однако, когда я добавить второй, почти идентичный тест на код ...

import pyodbc 
import random 
import unittest 
from EmailSender import EmailSender 

class TestSequenceFunctions(unittest.TestCase): 

    def setUp(self): 
     self.email_sender = EmailSender() 
     self.other_email_sender = EmailSender() 

    def test_for_initialisation_variables(self): 
     """ 
     Tests to check that the object is created properly 
     """ 
     self.assertTrue(self.email_sender.server) 
     self.assertTrue(self.email_sender.errorLogFile) 
     self.assertTrue(self.email_sender.connection) 
     self.assertTrue(self.email_sender.cursor) 
     self.assertTrue(self.email_sender.siteAuth) 
     self.assertTrue(self.email_sender.apiCallsLimitPerRun) 

    def test_SQL_Server_Connection(self): 
     for value in self.email_sender.cursor.execute("select * from sys.tables"):. 
      print value 

    def test_getSites_method(self): 
     for value in self.other_email_sender.cursor.execute("select * from sys.tables"):. 
      print value 

Третий тест завершается с ошибкой при слежении сообщение:

Error: ('IM001', '[IM001] [unixODBC][Driver Manager]Driver does not support this function (0) (SQLRowCount)')

п.с.

Просто отметим, что я начал с создания всего одного созданного объекта email_sender, но не смог выполнить обратные запросы, а затем изменил запрос на идентичность, и когда это не сработало, добавлено другое соединение и курсор, чтобы там не может быть никаких проблем: позиция с помощью курсора.

ответ

1

Обнаружено решение - в основном проблема была в методе tearDown по умолчанию.

Что-то происходит, чтобы курсор не будет сброшена - я отменяю этот метод с ниже, и вуаля, он работал:

def tearDown(self): 
    """ 
    Make sure we reset the cursor 
    """ 
    if self.email_sender.connection: 
     self.email_sender.connection.close() 
    del self.email_sender 
Смежные вопросы