与CruiseControl.NET集成的JavaScript单元测试

deh*_*eha 5 javascript cruisecontrol.net unit-testing

我正在寻找为JS提供单元测试的框架.后来,我将不得不将它与CruiseControl.NET集成.我有很多使用JS的asp网站,我需要自动化测试.例如,我使用本地JSUnit(可能是其他框架),这对我来说很容易,但我不知道如何将它与CC.NET集成.也许你可以告诉我如何开始?

注意:它必须是CC.NET,未指定单元测试的框架

Chr*_*ter 3

我意识到这是一个相当老的问题,但我有类似的兴趣,所以我想无论如何我都会发布答案。我假设您正在编写 OO 风格的 JavaScript 并想要测试这些对象。

人们推荐的一个常见解决方案是运行JsTestDriver,这绝对是一个很棒的工具;话虽这么说,它需要在您的计算机上安装 JVM 以及构建服务器。除了需要 JVM 之外,JsTestDriver 仍然依赖于运行一个或多个“从属”浏览器。就我个人而言,我认为在对 JavaScript 对象进行单元测试时,这不应该是一个问题。如果重点是 UI 测试,那么使用WatiN等工具在我看来是一种不同类型的测试。浏览器应该像使用JSMockJsMockito(我最喜欢的)模拟任何其他视图一样进行模拟。

为此,我多年来一直使用Windows Script Host来运行 JavaScript 单元测试。这有几个优点:

  1. 不需要浏览器(对我来说这是一件好事)。
  2. 自 XP 以来,CScript 已存在于每台 Windows 计算机上;所以没有什么可安装的。
  3. 在后台进程中运行,运行测试时不需要交互式 UI。
  4. 由于在 MSTest、NUnit 或 xUnit 等内部运行,因此与 CC.NET、Hudson 或 TeamCity 集成就像在构建过程中运行单元测试一样简单。
  5. 只需在调试器内运行单元测试即可获得完整的调试支持。

当然有一些缺点:

  1. 运行单元测试的机器必须能够生成新进程(CSCript)才能实际运行测试(这还不是问题)。
  2. 比运行常规单元测试慢(如果单独运行,在较旧的双核上略高于 1,000/分钟 - 即不捆绑在单个 CSCript 进程中)。

使用JSTest.NET(我已经使用多年但刚刚发布在网上的方法),您最终会得到一个可能类似于以下内容的测试装置:

using JSTest;
using JSTest.ScriptLibraries;
using Xunit;

namespace JSTest.Sample
{
  public class EventDispatcherTests
  {
    private readonly TestScript _testScript = new TestScript();

    public EventDispatcherTests()
    {
      //Append File(s) Under Test.
      _testScript.AppendFile(@"..\..\..\Web\Scripts\eventDispatcher.js");

      //Append Mock/Assertion libraries.
      _testScript.AppendBlock(new JsHamcrestLibrary());
      _testScript.AppendBlock(new JsMockitoLibrary());

      //Append Common "Setup" Scripts.
      _testScript.AppendBlock(@"var dispatcher = new EventDispatcher();
                                var mockHandler = JsMockito.mockFunction();
                                var mockPredicate = JsMockito.mockFunction();
                                var fakeEvent = { eventType: 'CommentAdded', data: 'Sample Comment' };
                              ");
    }

    [Fact]
    public void ProcessEventInvokesAttachedHandler()
    {
      ...
    }

    [Fact]
    public void ProcessEventGracefullyHandlesPredicateException()
    {
      _testScript.RunTest(@"var mockPredicateAlternate = JsMockito.mockFunction();

                            JsMockito.when(mockPredicateAlternate)(fakeEvent).thenThrow('MyException');

                            dispatcher.attachListener(mockHandler, mockPredicateAlternate);
                            dispatcher.processEvent(fakeEvent);

                            JsMockito.verify(mockPredicateAlternate)(fakeEvent);
                            JsMockito.verifyZeroInteractions(mockHandler);
                          ");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这种方法对我来说效果很好,而且设置起来非常简单。基本上,它就像编写常规单元测试一样,但是使用 JavaScript。