我想从 C# 程序集中执行 JavaScript 代码,并将 JavaScript 代码的结果返回到调用 C# 代码。

定义我不想做的事情更容易:

  • 我并不是试图从我的代码隐藏中调用网页上的 JavaScript 函数。

  • 我不想加载 WebBrowser 控件。

  • 我不想让 JavaScript 对服务器执行 AJAX 调用。

我想做的是用 JavaScript 编写单元测试,然后让单元测试输出 JSON,甚至纯文本也可以。然后我想要一个通用的 C# 类/可执行文件,它可以加载包含 JS 的文件,运行 JS 单元测试,废弃/加载结果,并在构建后任务期间返回包含详细信息的通过/失败。

我认为使用旧的 ActiveX ScriptControl 是可能的,但似乎应该有一种 .NET 方法来做到这一点,而不需要使用 SilverLight、DLR 或任何其他尚未发布的东西。有人有主意吗?

更新: 来自布拉德·艾布拉姆斯博客

namespace Microsoft.JScript.Vsa
{
    [Obsolete("There is no replacement for this feature. " +
              "Please see the ICodeCompiler documentation for additional help. " +
              "http://go.microsoft.com/fwlink/?linkid=14202")]

澄清:我们对 JavaScript 函数进行了单元测试,这些函数是使用 JSUnit 框架用 JavaScript 编写的。现在,在构建过程中,我们必须手动加载网页并单击按钮以确保所有 JavaScript 单元测试都通过。我希望能够在运行自动化 C# 单元测试时在构建后过程中执行测试,并与 C# 单元测试一起报告成功/失败,并将它们用作是否构建的指示器被打破。

有帮助吗?

解决方案

您可以使用 JSUnit 服务器从 Nant 内部运行 JSUnit,它是用 java 编写的,没有 Nant 任务,但您可以从命令提示符运行它,结果记录为 XML,您可以将它们与构建报告集成过程。这不会是您的 Nunit 结果的一部分,而是一份额外的报告。如果其中任何一个测试失败,我们的构建就会失败。我们正是使用 CC.Net 来做到这一点。

其他提示

该代码应该是非常不言自明的,所以我将其发布。

<add assembly="Microsoft.Vsa, Version=8.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/></assemblies>

    using Microsoft.JScript;

    public class MyClass {

    public static Microsoft.JScript.Vsa.VsaEngine Engine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();

        public static object EvaluateScript(string script)
        {
            object Result = null;
            try
            {
                Result = Microsoft.JScript.Eval.JScriptEvaluate(JScript, Engine);
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

            return Result;
        }

        public void MyMethod() {
            string myscript = ...;
            object myresult = EvaluateScript(myscript);
        }


    }

您可以使用 Microsoft Javascript 引擎 从 C# 评估 JavaScript 代码

更新:从 VS 2008 开始这已经过时了

我现在不知道任何 .NET 特定的方法可以做到这一点......好吧,仍然有 JScript.NET,但它可能与您需要执行的任何 JS 不兼容:)

显然,未来将是 DLR 的 .NET JScript 实现,即将到来......有一天(希望如此)。

因此,这可能需要运行旧的 ActiveX JScript 引擎,这当然可以从 .NET 中实现(我过去曾这样做过,尽管它有点难看!)。

如果您不在浏览器上下文中执行代码,为什么需要用 Javascript 编写测试?很难理解你在这里想要完成的事情的大局。

使用起来可以更简单吗 JS单元 编写测试,然后使用 等待测试包装器通过 C# 运行它们,根据 JSUnit 结果通过或失败?

但这确实是一个额外的步骤。

我相信我在某处读到,即将推出的 MBUnit 或 WatiN 版本将内置处理 JSUnit 测试装置的功能。要是我能记得我在哪里读到的就好了……

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top