2014-01-20 3 views
7
require './spec/spec_helper' 
require './bank' 

describe Bank do 
    context "#transfer" do 
    before(:all) do 
     @customer1 = Customer.new(500) 
     customer2 = Customer.new(0) 
     @customer1.stub(:my_money).and_return(1000) 
     customer2.stub(:my_money).and_return(0) 
     @transfer_message = Bank.new.transfer(@customer1, customer2, 2000) 
    end 

    it "should return insufficient balance if transferred amount is greater than balance" do 
     expect(@transfer_message).to eq("Insufficient funds") 
    end 

    it "calls my_money" do 
     expect(@customer1).to have_received(:my_money) 
    end 
    end 
end 

Когда я использую before(:each) вместо before(:all) это работает. Но если используется before(:all), он выдает ошибку как undefined method proxy_for for nil:NilClass. Я не мог понять причину. Не могли бы вы мне помочь? Заранее спасибо.метод гася на ранее (: все)

+0

Как я помню, 'before (: all)' лишен и заменен на 'before do ...' также более правильным способом, не использует переменные, вместо этого вы можете использовать 'let'. Если у вас есть nil: NilClass, это означает, что rspec не создавал запись клиента в базе данных (это может быть resolver, вызывая 'let! (: Object) {action}'). Что-то вроде этого. – itsnikolay

ответ

7

before(:all) не устарели, но использование удвоений от rspec-mocks в before(:all) не поддерживается. См. Связанные проблемы в github issue для фона.

Текущая версия master RSpec-издевается, будут доступны с 3.0.0.beta2, потерпит неудачу со следующей ошибкой:

The use of doubles or partial doubles from rspec-mocks outside of the per-test lifecycle is not supported. 

Предыдущие версии будут генерировать ошибку undefined method proxy_for ... в точке заглушек.

+0

Из любопытства вы могли бы рассказать мне, почему они не поддержали этот предыдущий rspec3? –

+0

Проверьте ссылки в проблеме github, и вы получите некоторый фон. –

5

Это должно работать:

require "rspec/mocks/standalone" 
before(:all) do 
+0

Осторожно. Это заставило меня больше ошибок повторять мои тестовые примеры: 'SQLite3 :: ConstraintException: UNIQUE constraint'. Может быть, добавление объяснения того, что такое автономное, было бы неплохо. Решив его, установив «отладчик» в верхней части тестового файла, удалил все записи модели, когда он запускался с помощью 'Model.destroy_all', а также удалил sql_sequence с помощью' Base.connection.execute'. –

5

Поздно партии? Да, но я не хотел бы отказываться от своего одного цента от того, что я обнаружил. Я столкнулся с подобной ошибкой, пытаясь заглушить запрос в блоке RSpec.configure, так что заглушка будет доступна только для примеров, в которых я передаю параметр config.around(:each, option).

Итак, это означает, что я использовал заглушку вне пределов отдельных примеров, которые не поддерживаются RSpec::Mockshere!. Работа вокруг заключается в использовании временной области в контексте.

Так у вас есть

before(:all) do 
    RSpec::Mocks.with_temporary_scope do 
    @customer1 = Customer.new(500) 
    customer2 = Customer.new(0) 
    @customer1.stub(:my_money).and_return(1000) 
    customer2.stub(:my_money).and_return(0) 
    @transfer_message = Bank.new.transfer(@customer1, customer2, 2000) 
    end 
end 

HTH!

+0

Это удивительно и, вероятно, должно быть в основном IMO, например. «при использовании подмножества отмеченных примеров это должно быть прекрасным и выполняться во временной области». – adarsh

Смежные вопросы