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

与CruiseControl.NET集成的JavaScript单元测试,javascript,unit-testing,cruisecontrol.net,Javascript,Unit Testing,Cruisecontrol.net,我正在寻找为JS提供单元测试的框架。稍后,我将不得不将其与CruiseControl.NET集成。我有很多使用JS的asp网站,我需要为它们自动化测试。例如,我使用了本地JSUnit(可能是其他框架),这对我来说非常简单,但我不知道如何将其与CC.NET集成。也许你能教我怎么开始 注意:它必须是CC.NET,单元测试框架未指定我意识到这是一个相当老的问题,但我有类似的兴趣,所以我想我会发布一个答案。我假设您正在编写OO风格的JavaScript,并希望测试这些对象 人们推荐的一个常见解决方案是运

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


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

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

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

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

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

  • 运行单元测试的机器必须能够产生新的进程(CSCript)来实际运行测试(这还不是一个问题)
  • 运行常规单元测试的速度较慢(如果单独运行,则在较旧的双核上的速度略高于1000/分钟,即不在单个CSCript进程中捆绑在一起)
  • 使用(我已经使用了多年,但刚刚发布在网上的方法),您最终得到的测试夹具可能类似于以下内容:

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

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

    我不明白-你是必须编写c代码来包装你的每个javascript测试,还是用c语言编写测试?@Johnny上面的例子是c代码包装javascript测试,但这不是首选的方法。。。可以在Wiki上找到与xUnit/nUnit/MSTest的干净集成,并允许使用带有C#test工具的JavaScript编写测试。还有一些例子@