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 (результаты, которые вы ищете). Вы хотите описать возможности системы и то, что пользователь может с ней сделать, а не то, является ли это веб-страницей или окном - это не должно иметь значения. Поместите вызовы более низкого уровня на более низкий уровень.

После этого вы можете получить два разных варианта - войти или не войти - и использовать остальные шаги для остальных.

Другие вопросы по тегам