class A
include Logging
log_to 'whatever'
end
我想测试是否使用正确的参数调用方法log_to
。但正如您可能已经猜到的那样,log_to
方法来自Logging模块,并在类加载时被调用。如何编写规范或自定义匹配器以检查是否正在调用log_to 'whatever'
?
即使我在log_to
上模拟class A
方法,规范也无法确定它是否会在类加载期间被调用时被调用。我尝试删除常量并再次加载它似乎不起作用。想法?
答案 0 :(得分:3)
这应该在spec文件的单独spec文件中,该文件测试A类的大部分功能:
describe 'A' do
it 'should log when loaded' do
class A ; end
A.should_receive(:log_to).with('whatever')
require 'a'
end
end
但我会考虑将类的行为更改为更容易测试的内容。在构造上不寻常或具有棘手限制的测试也是代码味道。
答案 1 :(得分:1)
您应该测试所需的结果,而不是实施细节。我会像以下一样单独测试Logging模块:
describe Logging do
TEST_IO = StringIO.new
# some stub class for testing
class Person
include Logging
log_to TEST_IO
def name
"Bob"
end
end
after do
TEST_IO.reopen
end
it "logs a method call to the given io" do
person = Person.new
TEST_IO.string.should eq("")
person.name
TEST_IO.string.should eq("name called\n")
end
# ...
end
我不确定我是否会测试使用该模块的真正类,因为它非常简单并且包含任何危险的逻辑。语法错误等意外错误将通过集成测试捕获。