没有“任务在初始化之前尝试记录”的单元测试 MSBuild 自定义任务 错误
我编写了一些运行良好的 MSBuild 自定义任务,并在我们的 CruiseControl.NET 构建过程中使用。
我正在修改一个,并希望通过调用任务的 Execute() 方法对其进行单元测试。
但是,如果遇到包含
Log.LogMessage("some message here");
它的行,则会抛出 InvalidOperationException:
Task 在初始化之前尝试记录。 消息是...
有什么建议吗? (过去,我主要在自定义任务上对内部静态方法进行单元测试,以避免此类问题。)
I have written a few MSBuild custom tasks that work well and are use in our CruiseControl.NET build process.
I am modifying one, and wish to unit test it by calling the Task's Execute() method.
However, if it encounters a line containing
Log.LogMessage("some message here");
it throws an InvalidOperationException:
Task attempted to log before it was initialized. Message was...
Any suggestions? (In the past I have mostly unit-tested Internal static methods on my custom tasks to avoid such problems.)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您需要设置您正在调用的自定义任务的 .BuildEngine 属性。
您可以将其设置为当前任务正在使用的同一 BuildEngine,以无缝包含输出。
You need to set the .BuildEngine property of the custom task you are calling.
You can set it to the same BuildEngine your current task is using to include the output seamlessly.
我发现除非任务在 msbuild 中运行,否则日志实例不起作用,因此我通常将调用包装到 Log,然后检查 BuildEngine 的值以确定我是否在 msbuild 中运行。 如下。
蒂姆
I have found that the log instance does not work unless the task is running inside msbuild, so I usually wrap my calls to Log, then check the value of BuildEngine to determin if I am running inside msbuild. As below.
Tim
@Kiff 对模拟/存根 IBuildEngine 的评论是个好主意。 这是我的 FakeBuildEngine。 提供了 C# 和 VB.NET 示例。
VB.NET
C#
@Kiff comment on mock/stub IBuildEngine is a good idea. Here is my FakeBuildEngine. C# and VB.NET examples provided.
VB.NET
C#
如果您已经实现了 ITask 接口,则必须自己初始化 Log 类。
否则你应该从 Microsoft.Build.Utilities.dll 中的 Task 继承
它实现了ITask,并为您完成了大量的跑腿工作。
这是构建自定义任务的参考页面,它解释了很多内容。
构建自定义 MSBuild 任务参考
另外值得一看的是
如何调试自定义 MSBuild 任务
除此之外,您可以发布 MSBuild您用于调用自定义任务的 XML。
代码本身显然是最有帮助的:-)
If you have implemented the interface ITask you will have to initialise the Log class yourself.
Otherwise you should just inherit from Task in Microsoft.Build.Utilities.dll
That implements ITask and does a lot of the leg work for you.
Here is the reference page for building a custom task, it explains quite a lot of it.
Building a custom MSBuild task reference
Also worth a look is
How to debug a custom MSBuild task
Other then that could you post the MSBuild XML you are using for calling your custom task.
The code itself would obviously be the most help :-)
我有同样的问题。 我通过存根构建引擎解决了这个问题。 像这样(AppSettings 是 MsBuild 任务名称):
I had the same problem. I solved it by stubbing the build engine. Like so (AppSettings is the MsBuild Task Name):
在
namespace
中的程序集System.Web
中,System.Web.Compilation
是一个实现IBuildEngine 的类
MockEngine
界面
以一种描述 Tim Murphy 的方式。In assembly
System.Web
innamespace
System.Web.Compilation
is a classMockEngine
which implementsIBuildEngine
interface
in a way which describes Tim Murphy.