Ich erhalte einige Tests Integration mit der Datenbank ausgeführt wird, und ich möchte eine Struktur haben, die etwa wie folgt aussieht:Wie bekomme ich die Nase nach Klassenattributen, die in einer Basistestklasse definiert sind?
class OracleMixin(object):
oracle = True
# ... set up the oracle connection
class SqlServerMixin(object):
sql_server = True
# ... set up the sql server connection
class SomeTests(object):
integration = True
# ... define test methods here
class test_OracleSomeTests(SomeTests, OracleMixin):
pass
class test_SqlServerSomeTests(SomeTests, SqlServerMixin):
pass
Auf diese Weise ich SQL Server Tests ausführen kann und Oracle-Tests separat wie dies:
nosetests -a oracle
nosetests -a sql_server
oder alle Integrationstests wie folgt aus:
nosetests -a integration
Allerdings scheint es, dass die Nase für attrib nur aussehen utes auf der Unterklasse, nicht auf der Basisklasse. So muss ich so die Testklassen definieren oder die Tests werden nicht ausgeführt:
class test_OracleSomeTests(SomeTests, OracleMixin):
oracle = True
integration = True
class test_SqlServerSomeTests(SomeTests, SqlServerMixin):
sql_server = True
integration = True
Dies ist ein bisschen langweilig zu halten. Irgendwelche Ideen, wie man das umgehen kann? Wenn ich nur mit einer Basisklasse beschäftigt wäre, würde ich einfach eine Metaklasse verwenden und die Attribute für jede Klasse definieren. Aber ich habe ein unbehagliches Gefühl, eine Metaklasse für die Testklasse, eine Metaklasse für Oracle und eine Metaklasse für SQL Server zu haben.
Wenn einer Ihrer Eltern-Klassen sind nicht "New-Style" -Klassen (das heißt, sie erweitern "Objekt" nicht), ich glaube nicht, dass es ein "__mro__" -Attribut geben wird. Nur eine kleine zwicken, aber ändern Sie die Zeile 'für Klasse_ ...' zu 'für Klasse_ in getattr (cls, '__mro__', []):' –