2015-01-19 4 views
1

Я пытаюсь сделать вариант сквозного тестирования в системе sailjs с использованием mocha. То, что я хочу сделать, это имитировать поток программ действий, делая такие вещи, как создание пользователя, а затем выполнение других действий с этим пользователем.Использование переменной --globals с набором тестов MochaJS

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

Mocha содержит опцию настройки --globals <value1, value2, etc>. Вот описание из документов:

--globals allow the given comma-delimited global [names]

Однако я не смог заставить это работать. Вот что я пробовал. У меня есть файл bootstrap.test.js, который делает основной до и после операций, начиная и остановочных парусов:

var Sails = require('sails'), 
    sails; 

before(function(done) { 
    Sails.lift({ 
    log: { 
     level: 'error' 
    } 
    }, function(err, server) { 
    sails = server; 
    if (err) return done(err); 
    // here you can load fixtures, etc. 
    done(err, sails); 
    }); 
}); 

after(function(done) { 
    // here you can clear fixtures, etc. 
    sails.lower(done); 
}); 

Тогда давайте говорить, у меня есть два тестовых файлов a.js и b.js, которые будут выполняться последовательно и для тестирования целей содержат очень мало:

a.js:

var user = 'some user'; 

b.js:

console.log(user); 

Если я затем запустить mocha --globals, я получаю ошибку:

ReferenceError: user is not defined

Что я здесь делаю неправильно? Я не смог найти нигде в Интернете описание того, как это будет использоваться.

+0

Кажется, мне удалось получить эту работу, просто используя глобальные переменные. [Variable] и после того, как назначенное значение можно получить в других тестах. Помогает ли это? – craigvl

+0

Можете ли вы привести более обширный пример кода? Благодаря! – fraxture

ответ

1

Вы неправильно поняли цель --globals. Это можно использовать при использовании --check-leaks. Опция --check-leaks проверяет, протекают ли тесты в глобальных пространствах. Рассмотрим этот набор:

it("one", function() { 
    foo = 1; 
}); 

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

Теперь, как вы можете достичь того, что хотите? Вы не можете создать глобальную переменную, если используете var.Ваш a.js должен быть:

user = 'some user'; 

Кроме того, по умолчанию Mocha не гарантирует порядок, когда он загружает тестовые файлы. Вы можете использовать --sort, чтобы гарантировать, что сначала загружается a.js, но вы вынуждены использовать имя, которое будет гарантировать этот заказ. Я предпочитаю использовать --require a, который сообщает Mocha, чтобы потребовать модуль a, прежде чем он начнет чтение тестовых файлов. Ваш модуль можно было бы назвать z и все равно будет загружен перед любым тестовым файлом. Во всяком случае, удалив var и используя --require, ваши тестовые файлы будут видеть ваш глобальный. (Я пробовал: он работает.)

0

Это, казалось, работал для меня с помощью sailsjs (я думаю, что было бы лучше сделать это), один из первых тестов, которые я бегу, чтобы зарегистрировать пользователя:

describe('#Should register test user', function() { 
    it('should register user', function (done) { 
     request(sails.hooks.http.app) 
      .post('/auth/registertest') 
      .send({ 
       "email": "[email protected]", 
       "password": "foo", 
       "firstname": "foo", 
       "lastname": "foo", 
       "location": { 
        "name": "foo", 
        "id": "54d733795ed3f5140b0a761b" 
       } 
      }) 
      .expect(200).end(function (err, res) { 
       if (err) return done(err); 
       global.email = "[email protected]"; 
       global.token = res.body.token; 
       done(); 
      }) 
    }); 
}); 

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

describe('#auth access to users bunches', function() { 
    it('should get 200', function (done) { 
     request(sails.hooks.http.app) 
      .get('/bunch/byuser') 
      .set('Authorization', 'bearer ' + token) 
      .expect(200).end(function (err, res) { 
       if (err) return done(err); 
       done(); 
      }) 
    }); 
}); 
Смежные вопросы