2010-07-07 136 views
5

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

注意:它必须是CC.NET,不指定

回答

3

我意识到这是一个相当古老的问题,但我有相似的兴趣,所以我想我会发布一个答案,无论单元测试框架。我假设你正在写OO风格的JavaScript并想测试这些对象。

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

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

  1. 没有浏览器要求(对我来说这是一件好事)。
  2. 自XP以来,CScript已经在每台Windows机器上运行;所以没有安装。
  3. 在后台进程中运行,运行测试时不需要交互式用户界面。
  4. 由于在MSTest,NUnit或xUnit等内部运行,与CC.NET,Hudson或TeamCity集成在一起就像运行单元测试一样简单。
  5. 只需在调试器中运行单元测试即可完全调试支持。

有一对夫妇,当然缺点:

  1. 运行单元测试的机器必须有产卵关新工艺实际运行测试(的能力(CSCRIPT)还有待一个问题)。
  2. 运行常规单元测试的速度较慢(如果单独运行,即在单个CSCript进程中没有捆绑在一起,则较旧的双核心稍微超过1,000 /分钟)。

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

这种方法很适合我,并且安装非常简单。基本上,它就像编写常规单元测试一样,但使用JavaScript。

+0

我不明白 - 你必须编写c#代码来包装你的每一个javascript测试,或者你在c#中编写测试吗? – 2014-05-14 14:21:09

+0

@Johnny上面的例子是C#代码包装javascript测试,但这不是首选的方式...干净的集成与xUnit/nUnit/MSTest可以在Wiki https:// github上找到。com/cbaxter/JSTest.NET/wiki,并允许使用C#测试工具以JavaScript编写测试。还有一些发现的例子:https://github.com/cbaxter/JSTest.NET/tree/master/src/Examples – 2014-05-14 14:59:44