В rspec, почему я не могу использовать be_false и т. Д. Во вспомогательных классах? - PullRequest
3 голосов
/ 26 июля 2010

При использовании вспомогательного класса с тестом rspec я не вижу возможности использовать идиому .should be_false. Это нормально в функции, определенной в вспомогательном файле .rb, но когда она находится внутри класса, символ be_false не найден. Пример ниже - почему это не работает? Как я могу использовать be_false и др. В качестве помощника?

Кажется возможным, что намеренные утверждения вроде этого работают только в самих тестах. У меня есть помощники, которые могут потерпеть неудачу из-за, например. проблемы с сетевыми коммуникациями, которые на самом деле являются подлинными сбоями при тестировании, поскольку сетевые коммуникации, которые используют мои помощники, являются частью тестируемой системы Как сделать так, чтобы мои тесты изящно проваливались во вспомогательном классе?

Результаты

$ spec ./test.rb 
helper_foo 1
helper_foo 2
helper_foo 3
FunctionFoo 1
F

1)
NameError in 'my_test should test that helper classes can use should be_false etc'
undefined local variable or method `be_false' for #<HelperFoo:0x2b265f7adc98>
./helper.rb:13:in `FunctionFoo'
./test.rb:13:

Finished in 0.004536 seconds

1 example, 1 failure

test.rb

require "helper.rb"

describe "my_test" do
    it "should test that helper classes can use should be_false etc" do

        (1 == 1).should be_true
        (2 == 1).should be_false

        helper_foo()

        instance = HelperFoo.new()
        instance.FunctionFoo
    end
  end

helper.rb

def helper_foo
    puts "helper_foo 1"
    (1==2).should be_false
    puts "helper_foo 2"
    (2==2).should be_true
    puts "helper_foo 3"
end

class HelperFoo
    def FunctionFoo
        puts "FunctionFoo 1"
        (1==2).should be_false
        puts "FunctionFoo 2"
        (2==2).should be_true
        puts "FunctionFoo 3"
    end
end

1 Ответ

5 голосов
/ 01 августа 2010

Ожидания типа be_true доступны только в контексте блока it. Когда вы вызываете метод на HelperFoo.new, он больше не выполняется в контексте того магического класса, с которым работает it.

Вам следует прочитать instance_eval, чтобы понять, что такое контекст оценки.

Также, если вам нужно определить примеры RSpec извне, вы должны использовать Shared Example Groups .

...