2013-03-23 1 views
0

Мой вопрос более общий. Во время работы с различными типами кода я запускал тесты rspec для контроллеров, где в каком-то коде используются рельсы и rspec API, а другие используют mock и stubbing, и я подумал.Использование mock и заглушек над рельсами и rspec API

Я имею в виду, что это PONS и против использования издеваться-х и заглушек над встроенными рельсами и RSpec API для тестирования контроллеров, а если кто-то может объяснить, какой подход лучше?

В целом, они могут делать то же самое (по крайней мере, до некоторой точки). Другое тогда разница между тем, как будет выглядеть код, или сделать тесты более выразительными,

ответ

2

Если ваш вопрос о том, почему насмехаться и заглушить, тогда нет короткого ответа. Эти задачи значительно упрощают тестирование, поскольку позволяют лучше контролировать поведение вашего программного обеспечения во время тестирования. Таким образом, тесты становятся быстрее, проще и более «унитарными».

Например, в действии create в вашем контроллере вы можете проверить его поведение при сохранении модели. Если вы не стучите, вам нужно создать два разных экземпляра; тот, который действителен, а другой - нет.

it "redirects to message with a notice on successful save" do 
    message_params = FactoryGirl.attributes_for(:message) 
    post :create, message_params 
    flash[:notice].should_not be_nil 
    response.should redirect_to(Message.last) 
end 
it "renders a :new template with a notice on unsuccessful save" do 
    message_params = FactoryGirl.attributes_for(:message, name: nil) 
    post :create, message_params 
    flash[:notice].should_not be_nil 
    response.should render_template :new 
end 

Как вы можете видеть, это было необходимо создать два экземпляра Message; один действительный и один недопустимый. Для их создания мы использовали FactoryGirl. Другими словами, тест не является полностью унитарным, поскольку другие вещи могут ошибиться в создании экземпляров. Мы действительно хотим проверить: перенаправляет ли она на страницу X, если сохранение было успешным? Поэтому мы просто хотим убедиться, что @message.valid? возвращает true в одном случае и false в другом случае. Это можно легко сделать с помощью заглушки:

it "should redirect to message with a notice on successful save" do 
    Message.any_instance.stubs(:valid?).returns(true) 
    post 'create' 
    flash[:notice].should_not be_nil 
    response.should redirect_to(Batch.last) 
end 
it "should render new template with a notice on unsuccessful save" do 
    Message.any_instance.stubs(:valid?).returns(false) 
    post 'create' 
    flash[:notice].should be_nil 
    response.should render_template('new') 
end  

Таким образом, в этом случае испытания, которые так намного легче, так как мы не должны создавать экземпляры объектов, мы просто окурок метод, чтобы вернуть то, что мы хочу, чтобы он вернулся. Есть много других причин для его использования, и вы можете узнать больше о насмехании и обучении.

Однако, если у вас есть вопросы, чтобы использовать встроенные в насмехающиеся и стробирующие функции Rspec или использовать внешние драгоценные камни, такие как Mocha, тогда ответ короче: сегодня я считаю, что это больше касается личных предпочтений. Раньше в таких структурах, как Mocha, были функции, которых Rspec не имел, например, метод any_instance, использованный выше. Но Rspec развился, и сегодня он так же хорош, как и другие.

+0

Благодарим вас за подробный ответ. Я имел в виду по обоим вопросам, поэтому спасибо, что нашли время ответить на них обоих. Ответ хороший, и это очень полезно. благодаря – Aleks