Я в главе 10 книги Foundation Rails 2. Мы работаем с RSpec.
Мы тестируем действие index для PluginsController.
Вот код для контроллера:
class PluginsController < ApplicationController
# GET /plugins
# GET /plugins.xml
def index
@plugins = Plugin.find(:all)
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @plugins }
end
end
Вот код для тестов для этого контроллера:
require File.dirname(__FILE__) + '/../spec_helper'
describe PluginsController, " GET to /plugins" do
before do
@plugin = mock_model(Plugin)
Plugin.stub!(:find).and_return([@plugin])
end
it "should be successful" do
get :index
response.should be_success
end
it "should find a list of all plugins" do
Plugin.should_receive(:find).with(:all).and_return([@plugin])
get :index
end
it "should assign the list of plugins to a variable to be used in the view"
it "should render the index template"
end
Когда мы писали наш тест, я думал, что эта строка
Plugin.should_receive(:find).with(:all).and_return([@plugin])
должен был иметь
@plugins
а не
@plugin
потому что в контроллере у нас есть
def index
@plugins = Plugin.find(:all)
Я хотел посмотреть, что произойдет, если я поменяю
Plugin.should_receive(:find).with(:all).and_return([@plugin])
до
Plugin.should_receive(:find).with(:all).and_return([@plugins])
и тест пройден.
Итак ... почему это @plugin, а не @plugins? И ... почему тест проходит с обоими?
Ура!