JS 单元测试无需将整个 HTML 复制到单元测试中?

Posted

技术标签:

【中文标题】JS 单元测试无需将整个 HTML 复制到单元测试中?【英文标题】:JS unit tests without having to copy the whole HTML into the unit test? 【发布时间】:2014-04-18 00:04:26 【问题描述】:

我正在为每个函数编写 JS 单元测试的项目中工作。假设你有 JS 代码为页面做一些事情,比如:

myProject.myPage.onDomReady = function() 
  $("#something").on("click", this.doSomething);
  $("#something-else").on("click", this.doSomethingElse);

在单元测试中,项目中的标准做法是将页面的html复制/粘贴到js测试中。喜欢:

module("pages/my_page_test.js", 
  setup: function() 
    this.myPage = Unit.fixture('\
      <div class="container" id="my-form-container" style="display: block;">\
        <div class="container-bg"></div>\
        <div class="container-box" style="width:250px">\
        <div class="container-title">\
          <span class="container-title-text">Engage?</span>\
        </div>\
      </div>\
    ');
  
);

通常它的行数比这多得多。

我的问题是:这是为页面功能编写 JS 单元测试的好方法吗?我的意思是你最终将大部分 HTML 页面复制到你的 JS 中只是为了测试。并且每次更改 HTML 时,理论上您也应该在测试中更新 HTML。

有没有更好的办法?

【问题讨论】:

我的需要大量 HTML 的单元测试在页面中具有所需 HTML 的网页中运行。 QUnit Cookbook - Keeping Tests Atomic 【参考方案1】:

使用以下方法之一:

通过 DOM 引用 HTML:

var foo = Unit.fixture(document.getElementById("foo").outerHTML)

通过the jQuery constructor生成标记

var foo = Unit.fixture($("<span/>", "class":"foo", "id":"bar", "html": "<span/>").get(0).outerHTML )

通过strings with Unicode escapes生成标记

var foo = Unit.fixture("<label><input type=|radio| name=|bar| value=|baz|>bop</label>").replace(/\|/g,"\u0022")

【讨论】:

以上是关于JS 单元测试无需将整个 HTML 复制到单元测试中?的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js—单元测试

单元测试

如何使用线程执行单元测试? [复制]

如何在 XCode4 中运行单元测试而无需切换到 UnitTest 配置文件/目标?

如何对剃刀视图进行单元测试

单元测试