#javascript #unit-testing #jasmine #karma-runner
#javascript #модульное тестирование #jasmine #карма-раннер
Вопрос:
Итак, у меня есть эти 2 случая в моих тестах. Первый работает нормально, во втором я пытаюсь извлечь объявление beforeEach наружу, и это не удается, но я не понимаю почему. Это простой случай, в основном я пытаюсь определить массив и выполнить цикл для этого, чтобы многократно запускать тесты с разными объявлениями параметров beforeEach.
ПРИМЕР 1
var params;
describe('When initializing', function () {
beforeEach(function () {
params = {
name: 'test 1'
};
});
it('should ..', function () {
params.name = 'test 2';
expect(...); => success
});
it('should ..', function () {
expect(...); => success because it expects params.name to be 'test 1' and it is 'test 1'
});
});
СЛУЧАЙ 2
var params;
var test = {
name: 'test 1'
};
describe('When initializing', function () {
beforeEach(function () {
params = test;
});
it('should ..', function () {
params.name = 'test 2';
expect(...); => success
});
it('should ..', function () {
expect(...); => fails because it expects params.name to be 'test 1' and it is 'test 2'
});
});
Во втором тесте, если я получу console.log(test.name)
внутри описания, которое я получу test 2
, каким-то образом оно было переопределено, хотя предыдущий it
сделал только params.name = 'test 2';
и не test.name = 'test 2';
Ответ №1:
Разница в том, что в случае 1 вы создаете новый объект каждый раз при вызове beforeEach, в то время как в случае 2 вы этого не делаете.
В сочетании с этим тот факт, что ваш первый тест изменяет объект. Если все тесты ссылаются на один и тот же объект (т.Е. случай 2), то эта мутация повлияет на любой код, который выполняется после первого теста. Если вместо этого объект перезаписывается перед каждым тестом (случай 1), то мутация не повлияет на другие тесты.
Есть несколько вариантов решения этой проблемы. Один из них заключается в том, чтобы просто сохранить случай 1; каждый раз возвращаясь к известному состоянию, вы можете получить чистое состояние для всех тестов для работы. Другой вариант — не изменять объект. Возможно, тесты могли бы скопировать объект, а затем изменить эту копию.
Комментарии:
1. Привет. Это не имеет никакого смысла. Первый тест — это в точности второй тест с той лишь разницей, что во втором объект извлекается наружу. Переменная test ни в какой момент не изменяется, и она используется внутри beforeEach. Что вы имеете в виду, говоря, что мой второй тест не создает новый объект, потому что это тот же тест, у него также есть beforeEach , поэтому он должен создать объект правильно? Мой вопрос в том, почему второй тест не работает, потому что мне нужно использовать его таким образом.
2.
The first test is exactly the second test with the only thing that in the second one, the object is extracted outside.
Результатом этого является то, что вы создаете параметры / тестовый объект только один раз (перед описанием), а затем делаете повторные ссылки на тот же объект. В случае 1 вы создаете совершенно новый объект перед каждым тестом.The test variable is not mutated at any point
мутация происходит в этой строке:params.name = 'test 2';
3. На всякий случай пока не ясно,
params = test;
совсем не копию объекта или создать новый объект. Это просто создает другую ссылку на тот же существующий объект.4. Это не тестовая переменная, это переменная params, которая также была изменена в первом тесте.
5. Это одно и то же. У вас просто есть две ссылки на один и тот же объект.