mercredi 28 mars 2018

Best way to pass data to a Mocha test that's run programmatically?

Trying to solve a problem where I can't seem to pass dynamically gathered data to Mocha tests.

Here is the logic of my application:

  1. Client submits their Github url. Request is made to Express/Node application.

  2. Express/Node application takes repo and username and makes request to Github API for data and adds the content of the files to an object as base64.

  3. The object with the files are passed to the relevant test files and then executed.

  4. The results are processed and preliminary grades are created. These are then sent back to the client.

Here is what a test file can look like:

    const chai = require('chai');
    const chaiSubset = require('chai-subset');
    chai.use(chaiSubset);
    const expect = chai.expect;
    const base64 = require('base-64');
    const HTML_CONTENT = require('../../00-sandbox-files/basic-portfolio-solution.json').html;
    const CSS_CONTENT = require('../../00-sandbox-files/basic-portfolio-solution.json').css;
    const decodedCSS = base64.decode(CSS_CONTENT[1].content);
    const cheerio = require('cheerio');
    const juice = require('juice');

    let decodedHTMLcontact;
    let decodedHTMLindex;
    let decodedHTMLportfolio;

    for (const obj in HTML_CONTENT) {
      if (HTML_CONTENT[obj].path == "contact.html") {
        decodedHTMLcontact = base64.decode(HTML_CONTENT[obj].content);
      } else if (HTML_CONTENT[obj].path == "index.html") {
        decodedHTMLindex = base64.decode(HTML_CONTENT[obj].content);
      } else if (HTML_CONTENT[obj].path == "portfolio.html") {
        decodedHTMLportfolio = base64.decode(HTML_CONTENT[obj].content);
      }
    }

    tests = function (html, css) {
      describe('HTML Elements tests that should pass for contact.html', function () {
        let $ = cheerio.load(decodedHTMLcontact);
        describe('HTML Elements that should exist in contact.html', function () {
          it('should contain a header element', function () {
            expect($('body').find('header').length).to.equal(1);
          });
          it('should contain a section element', function () {
            expect($('body').find('section').length).to.equal(1);
          });
          it('should contain several anchor elements', function () {
            expect($('nav').find('a').length).to.be.at.least(3, 'You need an additional anchor elements for your navigation elements');
          });
          it('should contain an h1 element', function () {
            expect($('body').find('h1').length).to.equal(1);
          });
          it('should contain a form element', function () {
            expect($('body').find('form').length).to.equal(1);
          });
          it('should contain a footer element', function () {
            expect($('body').find('footer').length).to.equal(1);
          });
        });

Here is the execution file for the Mocha tests:

const Mocha = require('mocha');

// Instantiate a Mocha instance.
const mocha = new Mocha();
const HW_PORTFOLIO_PATH = './server/05-run-testing-suite/HW-Week1-portfolio-wireframe/HW-1-portfolio.js';

function homeworkRouter(contentObj, repo) {
  switch (repo) {
    case "Basic-Portfolio":
      mocha.addFile(HW_PORTFOLIO_PATH);
      break;
    case "HW-Wireframe":
      mocha.addFile('./server/05-run-testing-suite/HW-Week1-portfolio-wireframe/HW-1-wireframe.js');
      break;
    default:
      console.log("No homework provided");
      break;
  }
}

module.exports = {

  // Run the tests and have info about what can be returned
  runTests: function(contentObj, repo) {
    homeworkRouter(contentObj, repo);
    console.log("Content Object", contentObj);
    console.log("Repo", repo);
    mocha.run()
    .on('fail', function (test, err) {
      console.log('Test fail');
      console.log(err);
    })
    .on('end', function () {
      console.log('All done');
    });
  }
}

Aucun commentaire:

Enregistrer un commentaire