Использование «следует» с методами класса? - PullRequest
0 голосов
/ 07 августа 2009

Я привык звонить, например:

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

но это дает очень плохое сообщение, когда оно терпит неудачу.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 07 августа 2009

Я не уверен, почему 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
0 голосов
/ 07 августа 2009

Хм, может быть, у меня есть идея.

File является частью собственно Ruby, поэтому в нем могут быть элементы, написанные на C. Некоторые инструменты метапрограммирования Ruby ломаются при работе с классами, импортированными из C, что может объяснить неспособность 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

Достоинством, особенно если ваш код интенсивно использует файлы, является возможность задавать действительно сложные сценарии и запускать их, не затрагивая медленную файловую систему. Все происходит в памяти. Быстрее, более полные спецификации.

Надеюсь, это поможет, удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...