【发布时间】:2016-11-17 12:59:24
【问题描述】:
我是 javascript 单元测试的新手,但我相信至少对一般的单元测试有一点了解。
我正在尝试学习“javascript 方式”并开始为我的客户端代码编写单元测试。
为此,我安装了以下库: mocha.js 和 chai.js
在一些令人惊讶的投票中,一切进展顺利。 我设法轻松地包含了这些内容并开始编写我的单元测试。
顺便说一句,我在 ASP Core 工作。虽然我发现 VS2016 是我用过的这个 IDE 中最有问题的版本(但我已经成为一名专业人士只有 5 年,所以我可能错了)新的 MVC 6 更改它提供了一种简单的方法来管理你的静态资源(或客户端依赖项),让您使用 bower 包管理器。
所以,回到测试。我从一个小列表开始,列出了一些我已经放置的通用和简单的 javascript 函数。虽然写得有点糟糕,但他们提供了一个很好的练习。
但是,过了一会儿,我需要开始模拟了。通过用 C# 编写单元测试,我开始欣赏这种类型的库的有用性。 由于这些概念并非特定于 C#,而是通常用于单元测试,因此我希望找到一个能够提供这种功能的库 - sinon.js。
再说一遍,一切都很顺利。
直到,我不得不嘲笑一个承诺。
再次证明,有一个库可以帮助我解决这个问题 - sinon-as-promised.js
在通过 npm 安装它、使用 browserify 等工具将其解析为单个脚本以在浏览器中使用等相当多的努力之后,我相信我设法让它运行起来。
此时我可以执行以下操作:
let returnsPromise = sinon.stub($, "ajax").resolves('success');
这将使我成为一个“then-able”对象(具有 then() 方法并且应该表现为承诺的东西)。 这里有一个小问题,它没有 .done() 和 .fail() 方法,众所周知,我在编码中更喜欢这些方法,但我猜有一种简单的方法可以将它们扩展到对象中。
在那之后,当我读到 chai.js 提供了一种管理 Promise expactations 的有效方法时,我什至开始印象深刻。
我们来了,我的问题。
我所说的关于 chai 的事情是“最终”的支持。一个让我变魔术并防止在 then() 的成功和错误回调中使用 .done() 的词,只是为了确保我们不会在承诺中得到误报。
所以,它应该是这样使用的:
it('testing eventually', function () {
let returnsPromise = sinon.stub($, "ajax").resolves('success');
return expect(returnsPromise()).should.eventually.equal('success');
});
如果发生任何与想要的结果不同的事情,这应该会失败。
现在,您可以想象当我无法按承诺运行 chai 时我的失望。
我找不到这个库的“浏览器友好”版本,所以在使用 npm 安装它之后,再次将它浏览器化为“应该在浏览器脚本中工作”我把它加入了聚会。
但是,无论我做什么,在上面的示例中,我都会收到以下错误:
TypeError: Cannot read property 'equal' of undefined
at Context.<anonymous> (js/miscellaneous-tests.js:94:58)
我将其解释为 - 我们不知道您所说的“最终”是什么意思。这让我相信我添加 chai-as-promised.js 的方式不起作用。
在这之后,我尝试了很多东西。有些愚蠢,有些甚至更愚蠢,但是无论我尝试了什么,它都无法让代码“最终”理解
这些内容包括:
- 读取脚本并获取 chai-as-promised 的依赖项并将其添加到解决方案中(作为 browserify-ed 和它们来自 npm 的形式),在第二种情况下,再次对其依赖项执行相同操作 - 直到我相信没有丢失任何包裹。
- 我尝试以多种不同的方式添加、删除文件,实际上我在写这篇文章时是在画一个空白 - 但我能想到的所有可能的组合 - 我都试过了。
- 我在 Google 上搜索了很多次“最终未定义”之类的东西,我觉得 Google 有点生我的气,但我找不到我要找的东西
- 在某个时候,我开始在地板上画一个带有五角星的大圆圈,但我花了一段时间(像处女的血和蜡烛这样的东西现在在办公室里不太容易找到)和第二天我回到办公室时,清洁工已经把它擦掉了。
由于我没有想法,我希望你们中的一些人尝试在浏览器中进行一些 javascript 单元测试。
因为它涉及到相当多的资源、解释和东西,而且这篇文章已经比它应该的要长,所以我创建了一个 github 存储库,我已经上传了我迄今为止所做的一切。
这里有一个链接: js-unit-test-mocking
顺便说一句,如果您不熟悉 ASP 或任何与微软相关的东西,那么运行它所需的一切都应该在 wwwroot 中。
感谢您对我的包容。抱歉,帖子太长了。
【问题讨论】:
标签: javascript unit-testing mocking sinon chai