2013-07-01 3 views
2

Я пытаюсь провести некоторое испытание с Жасмин и Требование. Все прошло очень хорошо, пока я не заметил, что у меня возникла проблема с контекстом описываемых функций.Асинхронный тест с жасмином

Я делаю тест Ajax, поэтому первое, что я делаю, это настроить слушателя на успех, а затем запросить его. Затем, в каждом из моих объявлений it(), я делаю свои тесты на основе ответа службы.

Вот мои spec modules:

// auth.js 
define(['service/auth'], function(auth) { 
    describe('Tests "auth" service', function() { 
    var data; 
    var OPTIONS = { 
     CN: '147144147', 
     GV: '147153162' 
    }; 

    auth.on.success.addOnce(function(response) { 
     data = response; 
    }); 

    auth.request(OPTIONS); 

    it('"status" should exist and be "true"', function() { 
     waitsFor(function() { 
     return data !== undefined; 
     }); 

     runs(function() { 
     expect(data['status']).toBeDefined(); 
     expect(data['status']).toBeTruthy(); 
     }); 
    }); 

    }); 
}); 

// login.js 
define(['service/login'], function(login) { 
    describe('Tests "login" service', function() { 
    var data; 
    var OPTIONS = { 
     oper: 1, 
     codigoouemail: '101', 
     senha: '10151015' 
    }; 

    login.on.success.addOnce(function(response) { 
     data = response; 
    }); 

    login.request(OPTIONS); 

    it('Should get the service response for user "' + OPTIONS.codigoouemail + '"', function() { 
     waitsFor(function() { 
     return data !== undefined; 
     }); 

     runs(function() { 
     expect(data).toBeDefined(); 
     }); 
    }); 

    }); 
}); 

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

У кого-нибудь есть идея, как это решить?

+0

На стороне примечание, [Jasmine 2.0.0] (http://jasmine.github.io/2.0/introduction.html) теперь имеет необязательный параметр 'done' для' it() ', который позволяет писать асинхронные тесты с меньшим количеством кода. Также обратите внимание, что если вы используете [Karma test runner] (http://karma-runner.github.io/0.10/index.html), [Karma в настоящее время поставляется в комплекте с Jasmine 1.3.1] (http: //stackoverflow.com/a/21117832/456814), поэтому вы не сможете использовать новый параметр 'done' в этом случае (по крайней мере, пока Karma не обновит свою версию Jasmine). –

+0

[Тестирование асинхронного Javascript с Jasmine 2.0.0] (http://blogs.lessthandot.com/index.php/webdev/uidevelopment/javascript/testing-asynchronous-javascript-w-jasmine/) - хорошая запись в блоге на как использовать новый Jasmine 2.0.0 'done', если у вас есть эта версия Jasmine. –

+0

@Cupcake О, наконец! Качественный товар. В настоящее время я запускаю тесты с Konacha plus Sinon и Chai. Я должен дать Жасмине еще один шанс :) –

ответ

1

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

+0

рад слышать, как вы решили тайну. –

0

Извините, но проблема не в переменной данных. Javascript имеет область функций, поэтому две переменные данных различны. Вот скрипка, показывая, что данные не совпадает: http://jsfiddle.net/LNuHU/2/

Ниже приведен код:

//--- SPECS ------------------------- 
describe('Tests timeout service 1', function() { 

     var data; 

     setTimeout(function(response) { 
      data = 3; 
     }, 1000); 


     it('Should be 3', function() { 

      waitsFor(function() { 
       return data !== undefined; 
      }); 

      runs(function() { 
       expect(data).toBe(3); 
      }); 

     }); 


     it('Should be 30', function() { 

      waitsFor(function() { 
       return data === 30; 
      }); 

      runs(function() { 
       expect(data).toBe(30); 
      }); 

     }); 

    }); 

describe('Tests timeout service 2', function() { 

     var data; 

     setTimeout(function(response) { 
      data = 30; 
     }, 2000); 


     it('Should be 30', function() { 

      waitsFor(function() { 
       return data !== undefined; 
      }); 

      runs(function() { 
       expect(data).toBe(30); 
      }); 

     }); 


     it('Should be 30', function() { 

      waitsFor(function() { 
       return data === 3; 
      }); 

      runs(function() { 
       expect(data).toBe(3); 
      }); 

     }); 

    }); 
+0

Да, я это знаю. Меня беспокоит то, что RequireJS должен обрабатывать область действия (и это действительно хорошо). Поэтому я предполагаю, что проблема заключается в том, что Jasmine не играет хорошо с асинхронным кодом в контексте функции. Я даже нашел некоторых людей с той же проблемой ... –

+0

Эй, теперь я вижу, что вы здесь сделали ... 'data' имеет другое значение для' describe() ', что и есть то, что я хочу, t Я получаю тот же результат? Когда я печатаю значение 'data', это всегда значение первого« ответа ». Это раздражает меня так плохо ... –

1

Так вот пример теста асинхронного я использую, чтобы проверить, если мой VOs создан:

it('should return a list of item VOs', function() { 
    var dfd = $q.defer(); 
    var items = mock.content.items[1].items; 

    runs(function() { 
    dfd.promise.then(function(VOs) { 
     expect(VOs.length).toBe(items.length); 
     expect(A.equals(itemVO(items[0]), VOs[0])).toBe(true); 
    }, this.fail); 
    }); 

    waits(50); 

    runs(function() { 
    itemsVO(dfd, items); 

    $rootScope.$digest(); 
    }); 
}); 

Итак, сначала я запустил функцию для прослушивания, когда моя функция асинхронизации завершилась, я жду 50 мс, чтобы проверить, что приложение готово, и затем я запустил свою функцию async. Обратите внимание, как expect находится в обратном вызове.

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