如何使用rspec在ruby中模拟super?

Joh*_*alo 20 ruby rspec rspec2

我通过创建一个扩展到库类的子类来扩展现有的库.

在子类中,我能够在initialize方法中测试大多数功能,但无法模拟super调用.子类看起来像下面的东西.

class Child < SomeLibrary
    def initialize(arg)
        validate_arg(arg)
        do_something
        super(arg)
    end

    def validate_arg(arg)
        # do the validation
    end

    def do_something
        @setup = true
    end
end
Run Code Online (Sandbox Code Playgroud)

我如何编写rspec测试(使用mocha)以便我可以模拟super调用?请注意,我正在测试类中initialize方法的功能Child.我是否必须创建单独的代码路径,super在提供额外参数时不会调用?

Myr*_*ton 19

你不能嘲笑super,你不应该.当你模拟某些东西时,你正在验证是否收到了一条特定的消息,而super不是一条消息 - 它是一个关键字.

相反,要弄清楚如果super缺少调用,这个类的行为会发生什么变化,并编写一个练习并验证该行为的示例.

  • 这是否意味着我不能为初始化编写 rspec 测试?为 initialize 方法编写单元测试是一种不好的做法吗?顺便说一下,我正在扩展数据库连接器库。如果我不写单元测试,而是写集成测试,我只是觉得 rspec 测试需要连接到真实数据库,这很奇怪。 (2认同)