2017-09-29 3 views
2

Ich benutze CAKE 0.21.1.0.Übergabe von CakeContext an eine andere .cake-Datei

Mein build.cake Skript lädt ein weiteres .cake Skript: tests.cake.

In tests.cake habe ich eine Klasse namens TestRunner. TestRunner hat eine Methode namens RunUnitTests(), die Komponententests unter Verwendung der VSTest Methode provided by CAKE ausführt.

In build.cake, erstelle ich mehrere Instanzen von TestRunner. Jedes Mal, wenn ich die RunUnitTests() Methode auf einem der Instanzen aufrufen, sehe ich die folgende Fehlermeldung:

error CS0120: An object reference is required for the non-static field, method, or property 'VSTest(IEnumerable<FilePath>, VSTestSettings)' 

Ich denke, das liegt daran, dass ich VSTest auf eine explizite Instanz von CakeContext in tests.cake anrufen müssen.

Meine Frage ist: Wie kann ich sicherstellen, dass mein tests.cake Skript die gleiche CakeContext Instanz wie mein build.cake Skript teilt? Was muss ich tun, damit tests.cake kompiliert wird?

EDIT:

Als Reaktion auf devlead's reply, habe ich beschlossen, mehr Informationen hinzuzufügen.

public void RunUnitTests(ICakeContext context) 

In build.cake, eine meiner Aufgaben macht folgendes::

TestRunner testRunner = TestRunnerAssemblies[testRunnerName]; 
testRunner.RunUnitTests(this); 

wo TestRunnerAssemblies ein Read-Only-Wörterbuch ist in

I devlead Vorschlag und änderte meine RunUnitTests() Methodensignatur gefolgt tests.cake und testRunnerName ist eine zuvor definierte Variable. (In build.cake habe ich #l "tests.cake" eingefügt.)

Jetzt sehe ich diese Fehlermeldung:

error CS0027: Keyword 'this' is not available in the current context 

Was mache ich falsch?

EDIT:

Es macht nichts, ich muss lernen, wie man mehr sorgfältig zu lesen. Anstatt this zu übergeben, übergab ich stattdessen Context, wie ursprünglich von Devlead vorgeschlagen. Jetzt kann die RunUnitTests Methode ohne Problem aufgerufen werden.

+0

Verwenden Sie keine 'this', verwenden Sie stattdessen' Context' wie hier gezeigt: https://github.com/cake -contrib/Cake.Recipe/blob/develop/setup.cake # L13 und auch, wie in @devlead Beispiel –

Antwort

4

Wenn RunUnitTests() eine statische Methode oder in einer Klasse ist, müssen Sie den Kontext als Parameter daran übergeben wie RunUnitTests(ICakeContext context), weil es ein anderer Bereich ist.

Und dann können Sie Aliase als Erweiterung für diese Methoden ausführen.

Beispiel:

RunUnitTests(Context); 

public static void RunUnitTests(ICakeContext context) 
{ 
    context.VSTest(...) 
} 

Beispiel mit Klasse:

Task("Run-Unit-Tests") 
    .Does(TestRunner.RunUnitTests); 

RunTarget("Run-Unit-Tests"); 


public static class TestRunner 
{ 
    public static void RunUnitTests(ICakeContext context) 
    { 
     context.VSTest("./Tests/*.UnitTests.dll"); 
    } 
} 
+0

Vielen Dank für Ihre Hilfe, Devlead! Ich habe einige Änderungen an meinem Beitrag als Antwort auf Ihre Antwort vorgenommen. –

+0

Senden Sie 'this' nicht' Context', wenn Sie mein erstes Beispiel lesen. – devlead

+1

Vielen Dank für Ihre Antwort. Ich muss lernen, genauer zu lesen :-) –

Verwandte Themen