0

我习惯拨打电话,例如:

new_count.should eql(10)

关于变量,但是我怎样才能用类方法做类似的事情File.directory?(my_path)呢?

File.should be_directory(my_path)我尝试过的每一种组合都会导致一个方法丢失,因为 Ruby 试图在我当前的对象上找到“be_directory”,而不是将其与 File 匹配。

我知道我可以把它转过来写

File.directory?(my_path).should == true

但是当它失败时,它会给出一个非常糟糕的信息。

有任何想法吗?

4

2 回答 2

0

嗯,也许我有个主意。

File是 Ruby 本身的一部分,因此它可能包含用 C 编写的元素。在处理从 C 导入的类时,Ruby 的一些元编程工具会崩溃,这可以解释 Rspec 未能.should按预期运行。

如果这是真的,这里没有真正的解决方案。我建议使用 MockFS 库:

MockFS 的这个缺点是在你通常使用 File、Dir 和 FileUtils 的任何地方都使用它:

require 'mockfs'

def move_log
  MockFS.file_utils.mv( '/var/log/httpd/access_log', '/home/francis/logs/' )
end

好处,特别是如果您的代码是文件密集型的,是能够指定非常复杂的场景,并让它们运行而不实际接触慢速文件系统。一切都发生在记忆中。更快、更完整的规格。

希望这有帮助,祝你好运!

于 2009-08-07T12:14:52.840 回答
0

我不确定为什么be_directory不适合你。您使用的是哪个版本的 rspec?当谓词存在时,您也可以使用 rspec 的predicate_matchers方法,但它不能很好地读取为be_predicate.

这是我尝试过的:

describe File, "looking for a directory" do

  it "should be directory" do
    File.should be_directory("foo")
  end

  predicate_matchers[:find_the_directory_named] = :directory?
  it "should find directory" do
    File.should find_the_directory_named("foo")
  end

end

这给了我以下输出(运行spec -fs spec.rb):

File looking for a directory
- should be directory
- should find directory

Finished in 0.004895 seconds

2 examples, 0 failures
于 2009-08-07T14:30:32.503 回答