gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 04:27:51 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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

为此,我使用了 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);
");
}
}
}

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

关于与 CruiseControl.NET 集成的 JavaScript 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3193005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com