1

如何重构以删除此规范中的代码重复:

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
4

1 回答 1

0

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

如果您确实决定删除重复项,请将其替换为可读的内容。我对 JSpec 不熟悉,但我希望有类似的东西

scannedData.shouldMatch "The Jacket", "2005"

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

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

将代码分为 Givens(与您如何到达那里无关的上下文)、Whens(通过应用程序发生的您实际想要测试其行为的事件)和 Thens(您正在寻找的结果)。您正在寻找描述系统的功能以及用户可以用它做的事情,而不是它是网页还是窗口 - 这无关紧要。将较低级别的调用放在较低级别。

然后,您可以有两个不同的给定 - 登录或未登录 - 并在其余部分重用其他步骤。

于 2010-06-18T11:10:09.357 回答