使用JSpec的BDD / TDD - 删除代码重复

时间:2010-06-18 00:53:53

标签: refactoring tdd bdd code-duplication 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 个答案:

答案 0 :(得分:0)

在BDD中,我们想要描述我们的应用程序或类的行为,以使它们易于更改。如果删除重复也会掩盖行为,请不要删除重复。代码读取的次数比编写的多10倍,IME甚至更多用于BDD场景和单元级示例。

如果您决定删除重复,请将其替换为可读的内容。我不熟悉JSpec,但我希望像

scannedData.shouldMatch "The Jacket", "2005"

检查标题和年份的所有相关结果。

删除与您是否登录无关的复制:

将代码分为Givens(无论你如何到达那里的上下文),Whens(通过app实际想要测试的行为的事件)和Thens(你正在寻找的结果)。你想要描述系统的功能和用户可以用它做的事情,而不是它是一个网页还是一个窗口 - 它应该无关紧要。将较低级别的电话放在较低的水平。

然后您可以有两个不同的分配 - 登录或未登录 - 并重复使用其他步骤。