我用的是CAKE 0.21.1.0。

我的build.cake脚本加载了另一个.cake脚本:tests.cake

tests.cake中,我有一个名为TestRunner的类。 TestRunner有一个称为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)'


我认为这是因为我需要在VSTest中的CakeContext的显式实例上调用tests.cake

我的问题是:如何确保我的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);


其中,TestRunnerAssembliestests.cake中的只读字典,而testRunnerName是先前定义的变量。 (在build.cake中,我插入了#l "tests.cake"。)

现在,我看到此错误消息:

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


我究竟做错了什么?

编辑:

没关系,我需要学习如何更仔细地阅读。正如devlead最初建议的那样,我没有传递this,而是传递了Context。现在,可以毫无问题地调用RunUnitTests方法。

最佳答案

如果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");
    }
}

关于c# - 将CakeContext传递到另一个.cake文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46485401/

10-11 17:33