gpt4 book ai didi

ruby - 在包含被测模块时使用 described_class

转载 作者:数据小太阳 更新时间:2023-10-29 07:14:12 32 4
gpt4 key购买 nike

我正在编写一些 rspec 来测试一些模块是否正确实现了它们的行为。

模块看起来像这样:

module Under::Test
def some_behaviour
end
end

我不能在 RSpec 中这样做:

describe Under::Test do
subject {Class.new{include described_class}.new}

在调用 #described_class 时,它无法再解析,因为 self 是 Class 的实例,它没有 #describe_class 方法。所以我不得不重复一遍:

subject {Class.new{include Under::Test}.new}

或者在规范中以与我的客户使用它的方式不同的方式使用它:

subject {Object.new.extend described_class}

这具有相同的最终效果,但我内心的某些想法认为,如果我要求我的客户包含 Under::Test,那么测试应该看起来尽可能接近他们的使用方式尽可能。

我可以使用闭包属性来解决这个问题,但我想知道它是否更好。这有代码味道吗?

describe Under::Test do
subject {mudule = described_class;Class.new{include mudule}.new}

it 'has some behaviour' do
expect(subject.some_behaviour).to be
end
end

注意,我也在 reddit 上的 r/ruby 中询问过,那里有人建议:

subject {Class.new.include(described_class).new}

这可能是我的方式。

最佳答案

如果您的最终目标是在新创建的 Class包含当前 described_class 模块,那么以下解决方法如何?

RSpec.describe NewModule do
let(:test_class) do
Class.new.tap do |klass|
klass.include(described_class)
end
end

specify do
expect(test_class.ancestors).to include described_class # passes
end
end

下面是一个在对象中包含模块方法的示例:

module NewModule
def identity
itself
end
end

RSpec.describe NewModule do
let(:one) do
1.tap do |obj|
obj.class.include(described_class)
end
end

specify do
expect(one.identity).to eq 1 # passes
end
end

请注意,Classinclude 方法在 Ruby v2+ 中不是 private。如果您使用的是旧版本,则必须使用 klass_name.send(:include, described_class)

关于ruby - 在包含被测模块时使用 described_class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33601898/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com