无法从 RSpec 调用 Ruby mixin 实例方法
Unable to call Ruby mixin instance method from RSpec
Objective:
我想 运行 对名为 Debug 的 mixin(模块)的实例方法进行基本 RSpec 单元测试。以下是 Debug mixin 的文件内容:
混合文件:./mixins/debug.rb
module Debug
public
def class_info?
"#{self.class.name}"
end
end
验证可从 RSpec:
访问的调试 mixin 实例方法
当我 运行 irb
并使用命令 require_relative './mixins/debug.rb'
和 include Debug
包含 Debug mixin,然后调用 Debug.class_info?
它成功 returns "Module"
然后如果我运行rspec
用下面的RSpec单元测试来确认RSpec上下文可以访问mixin的实例方法,测试成功通过:
RSpec 单元测试设置 #1:./spec/mixins/debug_spec.rb
require_relative '../../mixins/debug.rb'
RSpec.describe Debug, "#class_info?" do
include Debug
before(:each) do
@class_info_instance_method = Debug.instance_methods[0].to_s
end
context "with mixins" do
it "has class info instance method" do
expect(@class_info_instance_method).to eq "class_info?"
end
end
end
从 RSpec 调用 Debug mixin 实例方法时出现问题:
最后,我将 RSpec 单元测试更改为如下所示,因此它实际上调用了 Debug mixin 的 class_info?
实例方法:
RSpec 单元测试设置#2:./spec/mixins/debug_spec.rb
require_relative '../../mixins/debug.rb'
RSpec.describe Debug, "#class_info?" do
include Debug
before(:each) do
@class_info = Debug.class_info?
end
context "with mixins" do
it "shows class info" do
expect(@class_info).to eq "Module"
end
end
end
但是现在我在命令行运行rspec
的时候,为什么会出现return下面的错误呢?(注意:即使在之前的 RSpec 单元测试设置 #1 中完全相似,我检查过我可以成功访问此 Debug mixin 实例方法)
1) Debug#class_info? with mixins shows class info
Failure/Error: @class_info = Debug.class_info?
NoMethodError:
undefined method `class_info?' for Debug:Module
注意:以上代码我已经分享到我的RubyTest GitHub repo.
设置和参考资料:
我的系统:
- Ruby: ruby 2.3.0p0 (
ruby -v
)
- RSpec: 3.5.4 (
rspec -v
)
参考文献:
- 应用程序设计 Ruby 书的 Mixins 章节中的示例
当您包含一个模块时,这些方法将成为包含的 class 中的实例方法。 Debug.class_info?
不起作用,因为没有 class 方法 class_info?
。我也不确定您将模块包含在测试中的方式是否是最好的方式。这样的东西行得通吗?
require_relative '../../mixins/debug.rb'
class TestClass
include Debug
end
RSpec.describe Debug, "#class_info?" do
let(:test_instance) { TestClass.new }
context "with mixins" do
it "shows class info" do
expect(test_instance.class_info?).to eq "TestClass"
end
end
end
Objective:
我想 运行 对名为 Debug 的 mixin(模块)的实例方法进行基本 RSpec 单元测试。以下是 Debug mixin 的文件内容:
混合文件:./mixins/debug.rb
module Debug
public
def class_info?
"#{self.class.name}"
end
end
验证可从 RSpec:
访问的调试 mixin 实例方法当我 运行 irb
并使用命令 require_relative './mixins/debug.rb'
和 include Debug
包含 Debug mixin,然后调用 Debug.class_info?
它成功 returns "Module"
然后如果我运行rspec
用下面的RSpec单元测试来确认RSpec上下文可以访问mixin的实例方法,测试成功通过:
RSpec 单元测试设置 #1:./spec/mixins/debug_spec.rb
require_relative '../../mixins/debug.rb'
RSpec.describe Debug, "#class_info?" do
include Debug
before(:each) do
@class_info_instance_method = Debug.instance_methods[0].to_s
end
context "with mixins" do
it "has class info instance method" do
expect(@class_info_instance_method).to eq "class_info?"
end
end
end
从 RSpec 调用 Debug mixin 实例方法时出现问题:
最后,我将 RSpec 单元测试更改为如下所示,因此它实际上调用了 Debug mixin 的 class_info?
实例方法:
RSpec 单元测试设置#2:./spec/mixins/debug_spec.rb
require_relative '../../mixins/debug.rb'
RSpec.describe Debug, "#class_info?" do
include Debug
before(:each) do
@class_info = Debug.class_info?
end
context "with mixins" do
it "shows class info" do
expect(@class_info).to eq "Module"
end
end
end
但是现在我在命令行运行rspec
的时候,为什么会出现return下面的错误呢?(注意:即使在之前的 RSpec 单元测试设置 #1 中完全相似,我检查过我可以成功访问此 Debug mixin 实例方法)
1) Debug#class_info? with mixins shows class info
Failure/Error: @class_info = Debug.class_info?
NoMethodError:
undefined method `class_info?' for Debug:Module
注意:以上代码我已经分享到我的RubyTest GitHub repo.
设置和参考资料:
我的系统:
- Ruby: ruby 2.3.0p0 (
ruby -v
) - RSpec: 3.5.4 (
rspec -v
)
参考文献:
- 应用程序设计 Ruby 书的 Mixins 章节中的示例
当您包含一个模块时,这些方法将成为包含的 class 中的实例方法。 Debug.class_info?
不起作用,因为没有 class 方法 class_info?
。我也不确定您将模块包含在测试中的方式是否是最好的方式。这样的东西行得通吗?
require_relative '../../mixins/debug.rb'
class TestClass
include Debug
end
RSpec.describe Debug, "#class_info?" do
let(:test_instance) { TestClass.new }
context "with mixins" do
it "shows class info" do
expect(test_instance.class_info?).to eq "TestClass"
end
end
end