Un-Affe patching eine Klasse / Methode in Ruby

8

Ich versuche, ein Stück Code in Ruby zu testen, das File.open aufruft. Um es zu verharmlosen, habe ich File.open an folgendes angepasst:

%Vor%

Das Problem ist, dass ich rcov verwende, um diese ganze Sache auszuführen, da es File.open benutzt, um Code-Coverage-Informationen zu schreiben, es bekommt die monkey-patched-Version statt der echten. Wie kann ich diese Methode deaktivieren, um sie auf ihre ursprüngliche Methode zurückzusetzen? Ich habe versucht, mit alias herumzualbern, aber bis jetzt vergeblich.

    
Chris Bunch 25.10.2011, 16:27
quelle

5 Antworten

12

Erweitern Sie die Antwort von @ Tilo, und verwenden Sie den Alias ​​erneut, um das Affe-Patching rückgängig zu machen.

Beispiel:

%Vor%     
peakxu 25.10.2011, 20:31
quelle
2

File ist nur eine Konstante, die eine Instanz von Class enthält. Sie könnten es auf eine temporäre Klasse setzen, die auf open reagiert, und dann die ursprüngliche wiederherstellen:

%Vor%     
Matheus Moreira 25.10.2011 17:04
quelle
2

Sie können es einfach wie folgt alias:

%Vor%

z.B.:

%Vor%

Sie können jetzt noch über File.old_open

auf die ursprüngliche File.open-Methode zugreifen

Alternativ könnten Sie auch so etwas ausprobieren:

ruby ​​- override-Methode und dann rückgängig machen

Ссылка

    
Tilo 25.10.2011 17:42
quelle
1

oder Sie können ein Stubbing-Framework (wie rspec oder mocha) verwenden und die File.Open-Methode stubben.

Datei.stub (: open = & gt; "0 \ n")

    
Dan 25.10.2011 17:13
quelle
0

Der richtige Weg, dies zu tun, ist, ein Stubbing-Framework zu verwenden, wie Dan sagt.

Zum Beispiel würden Sie in rspec Folgendes tun:

%Vor%

Aber für Neugierige, hier ist ein halbwegs sicherer Weg, es ohne externe Bibliotheken zu tun. Die Idee ist, den Stub so zu isolieren, dass möglichst wenig Code davon betroffen ist.

Ich habe dieses Skript isolated-patch.rb :

genannt %Vor%

Demo:

%Vor%     
Kelvin 28.09.2012 18:21
quelle

Tags und Links