RSpec 超类不匹配 (Sinatra)

问题描述 投票:0回答:1

我有几个 Sinatra API 的规范文件。

他们都有这几行代码:

require 'rack/test'
require 'json'
require_relative '../../../app/main.rb'

module MysuperBlog
    class API

每个规范都成功,但是当我在不带参数的情况下运行

rspec
时,它会引发错误:

TypeError:
  superclass mismatch for class API

我猜这是由每个文件中定义的模块和类引起的。

我应该如何重新排序代码,以便各个测试和全局测试都通过而不会出现此错误?

ruby rspec
1个回答
0
投票

我猜这是由每个文件中定义的模块和类引起的。

Ruby 中的

class
关键字有两个用途:创建类和重新打开现有类。

如果你的类有除

Object
之外的超类,则必须在创建类时给出它,但在重新打开它时可以省略,例如:(我使用
Array
只是为了演示目的,你应该一般来说,不要对核心类进行子类化)

class Foo < Array ; end

class Foo ; end         # <- works

反之亦然会引发您所看到的错误:

class Foo ; end

class Foo < Array ; end # <- TypeError: superclass mismatch for class Foo

我假设您在应该创建类并指定其超类的文件之前加载应该重新打开该类的文件。

如果是这样,请确保先加载后者(

require
,例如在您的规范助手中),您的问题应该得到解决。


如果您实际上不想重新打开现有的类,而是尝试在测试中对不同的一次性和独立类重复使用相同的类名,则可以在之后通过

remove_const
删除常量你已经完成了课程,例如:

class Foo < Array ; end

Object.send(:remove_const, :Foo)

class Foo < String ; end # different Foo, no error
© www.soinside.com 2019 - 2024. All rights reserved.