2014-02-14 2 views
1

Я пытаюсь настроить тест контроллера, чтобы подтвердить, что одна из моих переменных экземпляра (@template) получает заданный вызов функции (deliver).присваивает (: var) .should_receive (: method) в контрольном тесте

С помощью следующего кода, однако, assigns получает оценку до posts, так assigns является nil:

it 'calls @template.deliver' do 
    assigns(:template).should_receive(:deliver).and_call_original 
    post :deliver, params 
    end  

Как я могу настроить этот тест эффективно?

Технология стека:
Рубин 1.9.3p448
Rails 3.2.13
RSpec рельсы 2.13.1 (для принятого ответа ниже, я должен был обновить до 2.14)

ответ

1

Предполагая, что @template является экземпляр Template объекта, вы можете быть в состоянии использовать rspecs ожидать синтаксис:

it 'calls @template.deliver' do 
    Template.any_instance.stub(deliver: true) 

    post :deliver, params 

    expect(assigns(:template)).to have_received(:deliver) 
end 
+0

я получаю «неопределенный метод' has_received?»Является ли' have_received' реализован в более позднем RSpec, чем то, что я писал в моей технической стопке выше ? – JellicleCat

+0

@JellicleCat это 'has_received' не 'has_received', но да - я считаю, что это было введено в 2.14 - жаль, что вы не заметили свой стек. – Kyle

+0

Я знаю, что это 'has_received'. Однако сообщение об ошибке относится к 'has_received? '. +1 в любом случае. – JellicleCat

0

Самый простой, кажется, чтобы создать свой шаблон объективистские т заранее, а затем окурок метод Template.find вернуть объект, который вы создали, что-то подобное (с использованием мокко в моем случае)

@template = ... 
Template.stubs(:find).returns(@template) 

Вы можете использовать инструкцию вы написали, как

@template.should_receive(:deliver).and_call_original 
0

Один из способов я могу думать о том, гася часть, которая присваивает шаблону

для например (при условии, что у вас есть отдельный тест для get_template):

Если у вас есть FOLLO Крыло доставить действие

def deliver 
    @template = get_template 
    @template.deliver 
end 

И ваш тест может быть

it 'calls @template.deliver' do 
    controller.should_receive(:get_template).and_return(mock_template = mock("template")) 
    mock_template.should_receive(:deliver).and_call_original 
    post :deliver, params 
end 
Смежные вопросы