2014-09-30 2 views
0

Я работаю над созданием модульной системы тестирования, и я пытаюсь выяснить, как возможен вывод следующего раздела кода без использования глобальных переменных:Создание модульной структуры тестирования, аналогичной Mocha JavaScript

describe("Test Title", function() { 
    it("should return a string", function() { 
     /* Assertions here */ 
    }); 
}); 
//OUTPUT: "PASS: Test Title should return a string" 

Может кто-нибудь объяснить, как вызов метода it каким-то образом удается получить один из его параметров до describe?

Если это не ясно, я пытаюсь сказать, что я хотел бы знать, как переменная может перемещаться через обратные вызовы. Если я понимаю, что происходит, вызов метода внешней функции в обратном вызове каким-то образом получает аргумент другой внешней функции.

+0

Вы можете посмотреть, как mocha определяет интерфейс BDD здесь: https://github.com/visionmedia/mocha/blob/master/lib/interfaces/bdd.js – naomik

+0

Я не совсем уверен, почему вы пытаетесь изобретать колесо здесь. Если вы не делаете что-то совершенно другое. – naomik

+0

Спасибо за ссылку @naomik. Это школьный проект, поэтому я пытаюсь понять это. Возможно ли, что вы можете вызвать обратный вызов с помощью метода '.call'? Не могли бы вы передать переменную для использования в другом методе? – HarrisonG16

ответ

1

Возможно, вы думаете, что it выполняет обратный вызов, переданный ему. Это не так. Он просто регистрирует обратный вызов в качестве теста.

Простейшая реализация для описания выполнения тестов:

var tests = []; 

function describe(description,fn) { 
    fn(); 
    for (var i=0;i<tests.length;i++) { 
     try { 
      tests[i].fn(); 
      console.log('FAIL:' + description + ' ' + tests[i].description); 
     } 
     catch (e) { 
      console.log('FAIL:' + description + ' ' + tests[i].description); 
     } 
    } 
} 

function it(description,fn) { 
    tests.push({ 
     description: description, 
     fn: fn 
    }); 
} 

Однако, из взглянув на код Мокко кажется, что даже describe не реально запустить код, только зарегистрировать тестовый набор для другой функции для обработки:

function describe(description,fn) { 
    fn(); 
    testSuites.push({ 
     description: description, 
     tests: tests.slice(0) 
    }); 
} 

Но логика такая же. Создайте структуру данных со всеми значениями и затем обработайте их.

Смежные вопросы