2017-09-29 59 views
2

我使用CAKE 0.21.1.0。將CakeContext傳遞給另一個.cake文件

我的build.cake腳本加載另一個.cake腳本:tests.cake

tests.cake,我有一個類叫TestRunnerTestRunner有一個稱爲RunUnitTests()的方法,該方法使用VSTest方法provided by CAKE執行單元測試。

build.cake中,我創建了幾個TestRunner的實例。每當我調用的實例中的任何一個RunUnitTests()方法,我看到了以下錯誤消息:

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

我想這是因爲我需要在tests.cake調用VSTestCakeContext明確的實例。

我的問題是:如何確保我的tests.cake腳本共享相同的CakeContext實例作爲我的build.cake腳本?我應該怎麼做才能編譯tests.cake

編輯:

針對devlead's reply,我決定添加更多的信息。

我跟着devlead的建議,改變了我的RunUnitTests()方法簽名:

public void RunUnitTests(ICakeContext context) 

build.cake,我的任務之一將執行以下操作:

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

其中TestRunnerAssemblies是隻讀辭典tests.caketestRunnerName是以前定義的變量。 (在build.cake,我已插入#l "tests.cake"。)

現在我看到此錯誤消息:

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

我在做什麼錯?

編輯:

沒關係,我需要學習如何更仔細地閱讀。而不是通過this,而是通過Context代替,正如devlead最初的建議。現在可以調用RunUnitTests方法而沒有問題。

+0

不要使用'this',而是使用'Context'如下所示:https://github.com/cake -contrib/Cake.Recipe/blob/develop/setup.cake#L13以及@devlead示例 –

回答

4

如果RunUnitTests()是一個靜態方法或在類中,您需要將上下文作爲參數傳遞給它,如RunUnitTests(ICakeContext context),因爲它是一個不同的範圍。

然後你可以執行別名作爲該方法的擴展。

例子:

RunUnitTests(Context); 

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

例如用類:

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

謝謝你的幫助,devlead!回覆您的回覆,我已對自己的帖子進行了一些更新。 –

+0

如果你讀過我的第一個例子,不要發送'this'發送'Context'。 – devlead

+1

謝謝你的回覆。我需要學習如何更仔細地閱讀:-) –