Mam projekt JavaScript, który chcę obserwować metodologię TDD. Wybrałem strukturę karmy i bibliotekę requirejs do tego i poszedłem za przykładem pokazanym w karmie docs here.jak zresetować moduł requirejs między testami jednostkowymi
Jest przykładem jednego pliku jednostka testu, który jest:
define(['app', 'jquery', 'underscore'], function(App, $, _) {
describe('just checking', function() {
it('works for app', function() {
var el = $('<div></div>');
var app = new App(el);
app.render();
expect(el.text()).toEqual('require.js up and running');
});
it('works for underscore', function() {
// just checking that _ works
expect(_.size([1,2,3])).toEqual(3);
});
});
});
Głównym problemem tego podejścia jest to, że nie ma sposobu, aby wyczyścić moduł App dla każdego testu. Więc jeśli w aplikacji są jakieś zmiany (takie jak zmiany zmiennych zamykających itp.) W jednym wywołaniu it
, mogą one wpływać na inne wywołanie it
.
Czy ktoś może coś na ten temat zaproponować? Są to takie popularne narzędzia, nie mogę uwierzyć, że nikt nigdy nie wpadł na taką sytuację.
Tak więc, aby podsumować to pytanie, chciałbym prosić o odpowiedź na którekolwiek z tych bardziej szczegółowych nich:
- jest jakiś sposób na „reset” (clear) moduł w requirejs? (faktycznie, przypuszczam, że nie ma takiego sposobu, z wyjątkiem ponownego ładowania wszystkich modułów po raz kolejny)
- czy istnieje lepsze podejście do uruchamiania karmy i requirejs, aby moduły nie miały żadnych pozostałości (efektów ubocznych) innych testy (
it
wywołań funkcji) na nich?
dziękuję, ale nie mogę się zgodzić z twoją sugestią * zaprojektowania twojej aplikacji tak, aby stan był związany z obiektem, który tworzysz, a nie z samym modułem *, ponieważ nawet gdybym to zrobił (chociaż nie chcę tego robić) w ten sposób), problem utrzymuje się, przynajmniej w JavaScript. Z uwagi na fakt, że definicja modułu jest funkcją, nawet jeśli zainicjuję obiekt, nie mogę na nim polegać jako * jasne * dla każdego testu (niektóre zmienne zamknięcia mogą być co najmniej zmieniane). – user907860
Wygląda na to, że znalazłem akceptowalne rozwiązanie, które zamierzam zamieścić jako odpowiedź poniżej – user907860
@ user907860 Musisz mieć błędne przekonanie o tym, jak działa JavaScript, ponieważ ** jest całkiem wykonalne **. Jak już powiedziałem w mojej odpowiedzi, zrobiłem to. – Louis