BDD / TDD с JSpec - устранение дублирования кода
Как мне сделать рефакторинг для удаления дублирования кода в этой спецификации:
describe 'TestPlugins'
describe '.MovieScanner(document)'
before_each
MoviePage_loggedIn = fixture("movie_logged_in.html") // Get logged-in movie page
MoviePage_notloggedIn = fixture("movie_not_logged_in.html") // Get non logged-in movie page
scanner = new MovieScanner() // Get movie scanner
end
it 'should scan logged-in movie page for movie data'
doc = MoviePage_loggedIn // Get document to scan
// Unit Tests
// ------------------------------------------------------------
// Test movie scanner's functions
scanner.getMovieTitle(doc).should.eql "The Jacket"
scanner.getMovieYear(doc).should.eql "2005"
// Test movie scanner's main scan function
scannedData = scanner.scan(doc)
scannedData.title.should.eql "The Jacket"
scannedData.year.should.eql "2005"
end
it 'should scan non logged-in movie page for movie data'
doc = MoviePage_notloggedIn // Get document to scan
// Unit Tests
// ------------------------------------------------------------
// Test movie scanner's functions
scanner.getMovieTitle(doc).should.eql "The Jacket"
scanner.getMovieYear(doc).should.eql "2005"
// Test movie scanner's main scan function
scannedData = scanner.scan(doc)
scannedData.title.should.eql "The Jacket"
scannedData.year.should.eql "2005"
end
end
end
1 ответ
В BDD мы хотим описать поведение нашего приложения или классов, чтобы их было легко изменить. Если удаление дублирования также затеняет поведение, не удаляйте дублирование. Код читается в 10 раз больше, чем написано, а IME даже больше для сценариев BDD и примеров на уровне модулей.
Если вы все равно решили удалить дублирование, замените его на что-нибудь читаемое. Я не знаком с JSpec, но я бы ожидал что-то вроде
scannedData.shouldMatch "The Jacket", "2005"
где все соответствующие результаты для названия и года проверяются.
Чтобы удалить дублирование независимо от того, вошли вы в систему или нет:
Разделяйте код на Givens (контекст, где не имеет значения, как вы туда попали), Whens (события через приложение, поведение которых вы на самом деле хотите проверить) и Thens (результаты, которые вы ищете). Вы хотите описать возможности системы и то, что пользователь может с ней сделать, а не то, является ли это веб-страницей или окном - это не должно иметь значения. Поместите вызовы более низкого уровня на более низкий уровень.
После этого вы можете получить два разных варианта - войти или не войти - и использовать остальные шаги для остальных.