Mam wiele testów, które są praktycznie takie same. W interesie DRY i możliwości skanowania chciałbym streścić testy w jedną funkcję, a następnie wywołać tę funkcję za pomocą kilku parametrów. Funkcja będzie wtedy wywoływać it
i dodać specyfikację do pakietu.Czy można zdefiniować specyfikację Jasmine wewnątrz funkcji i nadal mieć przed nią zastosowanie do niej?
Wygląda na to, że działa, z wyjątkiem tego, że specyfikacje nie są uruchamiane w taki sam sposób, jak inne specyfikacje, a nazwa beforeEach
nie jest wywoływana przed specyfikacjami zdefiniowanymi we wspólnej funkcji.
define(['modules/MyModule','jasmine/jasmine'], function(MyModule) {
describe('myModule', function() {
function commonTests(params) {
it('should pass this test OK', function() {
expect(true).toBe(true);
});
it('should fail because module is undefined', function() {
expect(module[params.method]()).toBe('whatever');
});
}
var module;
beforeEach(function() {
module = new MyModule();
});
describe('#function1', function() {
commonTests({
method: 'function1'
});
});
describe('#function2', function() {
commonTests({
method: 'function2'
});
});
});
});
Czy jest jakiś sposób to zrobić i zachowaniu funkcjonalności beforeEach
i afterEach
?
UPDATE:
Wygląda jak mam mój przykład nie tak, przepraszam. Tu jest tak, że kończy się niepowodzeniem:
define(['modules/MyModule'], function(MyModule) {
function commonTests(params) {
it('will fail because params.module is undefined', function() {
expect(typeof params.module).toBe('object');
expect(typeof params.module[params.method]).toBe('function');
});
it('has a few tests in here', function() {
expect(true).toBe(true);
});
}
describe('MyModule', function() {
var module;
beforeEach(function() {
module = new MyModule();
});
describe('#function1', function() {
commonTests({
module: module,
method: 'function1'
});
});
describe('#function2', function() {
commonTests({
module: module,
method: 'function2'
});
});
});
});
myślę, że to nie działa, ponieważ wartość module
jest zachowana w ramach wezwania do commonTests
zamiast zawsze przy użyciu bieżącej wartości module
jak w pierwszym przykładzie. Wyślę moje rozwiązanie, kiedy tam dotrę ...
Interesujące, masz rację oczywiście: to require.js. Rzecz w tym, że wiem, że MójModuł jest ładowany OK, ponieważ są inne testy, które go używają, które nie są w "testach wspólnych" (które zostawiłem dla zwięzłości) i przechodzą dobrze. Po uruchomieniu debuggera w 'commonTests' i sprawdzeniu wartości' module' jest to wartość 'niezdefiniowana'. Ma poprawną wartość w testach poza "testami wspólnymi" ... Dzięki za rozpatrzenie tego! –
Przypuszczam, że pozostałe testy znajdują się w dwóch "opisowych" wywołaniach na dole, prawda? Pamiętam, że przeczytałem coś o zakresach 'var' w JS. W niektórych przypadkach zmienne zdefiniowane za pomocą funkcji 'var' w funkcjach są dostępne tylko po wyrażeniu' var'. Jeśli tak jest w tym przypadku, spróbujesz uzyskać dostęp do globalnego 'module' (który nie istnieje) w' commonTests'. Być może możesz spróbować przenieść 'var module;' i 'beforeEach' na szczyt otaczającego' opisania'. – Andreas
Dzięki Andreas, rzuciłem okiem i porównałem ten przykład z moim kodem, który był nieco inny. Wysłałem aktualizację w pytaniu ... –