RSpec kann Anforderungen derart in einer auf Ruby aufgebauten domain-spezifischen Sprache formulieren, dass es sich fast wie englisch liest, aber als Unit-Test ausgeführt werden können. RSpec kann "Examples" mittels "describe" und "it" beschreiben, "Expectations" mittels "should" definieren und mit Mocks und Stubs nicht für die Tests relevante Teile ersetzen.
RSpec fügt dazu der Ruby-Klasse "Object" einige Methoden hinzu. Hier sehe ich bei Python ein Problem. Ich finde (als relativer Python-Neuling) keinen Weg, "object" um weitere Methoden zu erweitern. Auch finde ich keine Syntax, die nicht umständlich unbeholfen aussieht.
Code: Alles auswählen
describe Account, " when first created" do
before do
@account = Account.new
end
it "should have a balance of $0" do
@account.balance.should == 0
end
end
Code: Alles auswählen
class Account_when_first_created(Spec):
what = Account
when = "first created"
def before(self):
self.account = Account()
@it("should have a balance of $0")
def example(self):
should(self.account.balance) == 0
Meine Hoffnung ist, dass ich als hier "example" getauften Methoden (warum kennt Python keine anonymen Funktionen oder Methoden - das wäre nett hier) mit dem selben Namen versehen kann und in "it" dafür sorgen kann, dass sie besondere interne Namen bekommen.
Leider scheint Python nicht zu erlauben, dass ich diesen Trick auch für Klassen benutzen kann. @-Attribute für Klassen sind kein Sprachbestandteil.
Das "should" ist mein hilfloser Versuch, damit klar zu kommen, dass ich nicht einfach eine neue Methode für "object" definieren kann. Es muss eine globale Funktion sein, die man jetzt explizit importieren muss.
Eine andere Idee, die ich hatte ist, nach dem "before" einfach alles, was dann in __dict__ steht - also alle Exemplarvariablen - mit so einer Methode zu versehen:
Code: Alles auswählen
class Should:
def should(self): ...
...
for v in self.__dict__.values():
if is_real_object(v): v.should = Should.should
Stefan