今天试了试django自带的test模块,断点执行到一下代码中时发现一点儿小问题:
def _create_test_db(self, verbosity, autoclobber): """ Internal implementation - creates the test db tables. """ suffix = self.sql_table_creation_suffix() test_database_name = self._get_test_db_name() qn = self.connection.ops.quote_name # Create the test database and connect to it. We need to autocommit # if the database supports it because PostgreSQL doesn't allow # CREATE/DROP DATABASE statements within transactions. cursor = self.connection.cursor() self._prepare_for_test_db_ddl() try: cursor.execute( "CREATE DATABASE %s %s" % (qn(test_database_name), suffix)) except Exception as e: sys.stderr.write( "Got an error creating the test database: %s " % e) if not autoclobber: confirm = input( "Type 'yes' if you would like to try deleting the test " "database '%s', or 'no' to cancel: " % test_database_name) if autoclobber or confirm == 'yes': try: if verbosity >= 1: print("Destroying old test database '%s'..." % self.connection.alias) cursor.execute( "DROP DATABASE %s" % qn(test_database_name)) cursor.execute( "CREATE DATABASE %s %s" % (qn(test_database_name), suffix)) except Exception as e: sys.stderr.write( "Got an error recreating the test database: %s " % e) sys.exit(2) else: print("Tests cancelled.") sys.exit(1) return test_database_name
有问题的代码在于,confirm根本无法从dos输入获得‘yes’,因为输入后,会将换行符' '也读进去。因此,无论输入yes 还是cancel,都会走到线面的else分支,
print("Tests cancelled.") sys.exit(1)
改掉代码后,正确执行,销毁旧的database,新建了test database。