我使用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);
其中TestRunnerAssemblies
是tests.cake
中的只读字典,testRunnerName
是先前定义的变量。 (在build.cake
中,我插入了#l "tests.cake"
。)
现在我看到此错误消息:
error CS0027: Keyword 'this' is not available in the current context
我做错了什么?
修改
没关系,我需要学习如何仔细阅读。我没有传入this
,而是传递了Context
,正如devlead最初建议的那样。现在可以毫无问题地调用RunUnitTests
方法。
答案 0 :(得分:3)
如果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");
}
}