使用mocha javascript时如何模拟dom元素?

时间:2017-07-04 13:00:56

标签: javascript mocha

我正在使用mocha来测试我的JavaScript代码。该代码涉及html和css并实现了一个聊天应用程序。据我所知,Mocha可以通过将期望值与函数的返回值进行匹配来测试JavaScript函数。

但是,如果我想测试不返回值的函数怎么办?主要处理DOM元素的函数。 (例如附加图像)。

我如何在mocha中模拟DOM元素,然后测试函数是否成功生成适当的DOM元素?

我环顾四周,发现有可能使用selenium webdriver和jsdom。是否可以单独使用 mocha 进行此测试而没有其他额外接口?

3 个答案:

答案 0 :(得分:1)

JSDOM很方便,因为它允许您测试“真正的”DOM实现,而无需在Web浏览器中运行。

如果你能run your unit tests inside a browser,你可以用同样的方式对DOM进行断言:

describe("the super special button", () => {

  it("adds an image", (done) => {
    const button = document.querySelector(".js-super-special");
    button.click();

    // give the browser a chance to update the DOM
    setTimeout(() => {
      const image = document.querySelector(".js-image")

      // using assertion library, like chai
      expect(image).to.not.beNull();

      // or using a port of Node's `assert` from a bundler like browserify:
      assert(image != null);

      done();
    })
  })
});

答案 1 :(得分:0)

您必须在nodejs上下文中使用伪造的DOM API,并使它们在挂接Mocha之前全局化。

beforeEach(() => {
  const dom = new JSDOM(
    `<html>
       <body>
       </body>
     </html>`,
     { url: 'http://localhost' },
  );

  global.window = dom.window;
  global.document = dom.window.document;
});

在此处了解更多信息:https://seesparkbox.com/foundry/improve_unit_testing_with_mocha_chai_jsdom

答案 2 :(得分:0)

您可以使用 jsdom-global 包替代品,它也适用于 Mocha 之外。 mocha-jsdom 仍然有效,但更好地支持 jsdom-global。

npm install --save-dev --save-exact jsdom jsdom-global

修改 npm 测试脚本为:

"test": "mocha -r jsdom-global/register"

测试示例:app.test.js

import {JSDOM} from 'jsdom'; // can also use common js

describe('DOM', () => {
  it('should log selector list', () => {
    const dom = new JSDOM(
      `<html>
         <body>
           <div class="card">1</div>
           <div class="card">2</div>
           <div class="card">3</div>
         </body>
       </html>`,
     {url: 'http://localhost'},
    );
  });

  global.document = dom.window.document;
  console.log(document.querySelectorAll('.card'));
});