Toy приложение с примерами написания спек

2 просмотра
Перейти к первому непрочитанному сообщению

Michael Klishin

не прочитано,
7 нояб. 2007 г., 05:46:1507.11.2007
– ror...@googlegroups.com
Закомиттил незакоммитченное и
перезалил слепок:

novemberain.com/pub/estimateit_exported.tar.bz2

Комментировать, пожалуй, лучше прямо в
этом треде.


MK

Timur Vafin

не прочитано,
7 нояб. 2007 г., 06:02:1707.11.2007
– ror...@googlegroups.com
Michael Klishin пишет:

> Закомиттил незакоммитченное и
> перезалил слепок:
>
> novemberain.com/pub/estimateit_exported.tar.bz2

А чего вы молчали про rspec_on_rails_matchers? Полезная штука =)

def create
@account = Account.new(params[:account])
@account.save!

redirect_to accounts_url
flash[:notice] = "Account successfully created"
rescue ActiveRecord::RecordInvalid
flash[:error] = "Signup is not successful."
render :action => 'new'
end

А вот тут зачем эксепш перехватывать, просто сделать save почему нельзя?
Вижу много контроллеров, где before_filter :login_required, имхо,
правильнее:
* котроллеры, требующие авторизации положить в /user/
* наследовать их от какого нибудь Base::UserController с
before_filter :login_required

Олег Андреев

не прочитано,
7 нояб. 2007 г., 06:12:1907.11.2007
– ror...@googlegroups.com
Почитайте про Traits в Sqeak smalltalk =) Наследование здесь ни причем.

Правильно - before_filter :login_required, или, если вы регулярно
ломаете фильтры в рельсе, - require_login:

class ApplicationController
def self.require_login
before_filter :login_required
end
end

class MyController < ApplicationController
require_login
...
end

(по мотивам acts_as_*)

07.11.2007, в 14:02, Timur Vafin написал(а):

Timur Vafin

не прочитано,
7 нояб. 2007 г., 06:15:0707.11.2007
– ror...@googlegroups.com
Олег Андреев пишет:

> Почитайте про Traits в Sqeak smalltalk =) Наследование здесь ни причем.

> Правильно - before_filter :login_required, или, если вы регулярно
> ломаете фильтры в рельсе, - require_login:

Почему правильно?

Michael Klishin

не прочитано,
7 нояб. 2007 г., 06:18:4107.11.2007
– ror...@googlegroups.com
Это все лежащее в шаблонном приложении
добро, которое я просто заодно покрыл
тестами. Это из restful authentication. Вопрос
вкуса, мне не мешает.

Контроллеры наследуем, просто
аппликуха такая простенькая, что на
это все внимания не обращалось.
Главная цель – доделать ее, чтобы она
помогала своей целевой аудитории, а
также иметь там спеки, которые можно
показывать в качестве примера :)

On 7 нояб. 2007, at 14:02, Timur Vafin wrote:

>
> def create
> @account = Account.new(params[:account])
> @account.save!
>
> redirect_to accounts_url
> flash[:notice] = "Account successfully created"
> rescue ActiveRecord::RecordInvalid
> flash[:error] = "Signup is not successful."
> render :action => 'new'
> end
>

MK

Eugene Bolshakov

не прочитано,
10 нояб. 2007 г., 15:59:1110.11.2007
– RubyOnRails to russian
Спасибо большое за пример. Не знаю как другим, а мне как начинающему
очень полезным оказалось - переписал кучу своих спек.
Еще пришла мысль о matcher для проверки attr_protected,
attr_accessible (только что потратил время на тупеж после добавления
нового аттрибута и втыкания почему он через форму не устанавливается):

module Spec
module Rails
module Matchers
class HaveAccessible
def initialize(attribute)
@attribute = attribute
end

def matches?(model)
@model = model
initial_value = @model.send @attribute
@model.send "#{@attribute}=", nil
@model.attributes = {@attribute => '1'}
result = @model.attributes_before_type_cast[@attribute] ==
'1'
@model.send "#{@attribute}=", initial_value
result
end

def failure_message
"expected #{@model.class} to have accessible #{@attribute}"
end

def negative_failure_message
"expected #{@model.class} to have protected #{@attribute}"
end

def description
"validate accessibility of #{@attribute}"
end
end

def have_accessible(attribute)
HaveAccessible.new(attribute)
end
end
end
end

и в спеке имеем нечто вроде:

describe Article do

before(:each) do
@article = Article.new
end

%w{title permalink excerpt body comments_allowed}.each do |
attribute|

it "should have accessible #{attribute}" do
@article.should have_accessible(attribute)
end

end

%w{author_id published_at}.each do |attribute|

it "should have protected #{attribute}" do
@article.should_not have_accessible(attribute)
end

end

...
end

Несколько тупая проверка значения в матчере, навереное нужно смотреть
тип column и согласно нему какое-то тестовое значение выставлять, но
для меня работает. Что Вы думаете (тестируете ли вообще такие вещи)?

Кстати идея Universe тоже очень понравилась т.к. решает постоянную
проблему.

Eugene Bolshakov

не прочитано,
12 нояб. 2007 г., 08:58:5112.11.2007
– RubyOnRails to russian
Eще пока думал, как луче тестировать acl. пришло в голову - может быть
вместо shared behaviours для тестирования аутентификациии сделать
опять же matcher?

Нечто вроде

describe CommentsController do

%w{create edit update destroy}.each do |action|

it "should require authentication on #{action}" do
@controller.should require_authentication_on_action(action)
end

end

end


И

module Spec
module Rails
module Matchers

class RequireAuthenticationOnAction
def initialize(action, response, expected_url)
@action, @response, @expected_url = action, response,
expected_url
end

def matches?(controller)
@controller = controller
return false unless @response.redirect?
@response.redirect_url == @expected_url
end

def failure_message
"expected #{@controller.class} to require authentication on
action #{@action}"
end

def negative_failure_message
"expected #{@controller.class} to allow public access for
action #{@action}"
end

def description
"validate public inaccessibility of #{@action}"
end
end

def require_authentication_on_action(action)
get action
RequireAuthenticationOnAction.new(action, response, login_url)
end
end
end
end

С одной стороны это на тот случай, когда в контроллере есть не только
CRUD actions, а с другой, думаю попытаться в аналогичном ключе
изобразить что-нибудь для ACL, где нагенерить shared behaviours врядли
будет возможно. Или это плохая идея?

Michael Klishin

не прочитано,
12 нояб. 2007 г., 09:13:2512.11.2007
– ror...@googlegroups.com
Практика показывает, что матчеры для
контроллеров обычно слишком сложно
делаются, чтобы париться с ними.
Поэтому используем шарные бихейворы с
определенной политикой наименования
(... action guard).

On 12 нояб. 2007, at 15:58, Eugene Bolshakov wrote:

> Eще пока думал, как луче тестировать
> acl. пришло в голову - может быть
> вместо shared behaviours для тестирования
> аутентификациии сделать
> опять же matcher?

MK

Nexus

не прочитано,
19 нояб. 2007 г., 08:04:4019.11.2007
– RubyOnRails to russian
Миша,
у вас получился бы замечательный скринкаст по использованию спеков (а
заодно и емакса), который я, как и многие другие, с удовольствием бы
посмотрел.

Попробуете?

On 12 нояб, 16:13, Michael Klishin <michael.s.klishin.li...@gmail.com>
wrote:

Mihserf

не прочитано,
19 нояб. 2007 г., 08:55:1119.11.2007
– RubyOnRails to russian
Не смотря на то, что данное сообщение не коммент к приложению Михаила,
оно тут, думаю, лишним не будет.

Нашёл пример приложения со спеками (хотя тоже без историй):
http://tuples.us/2007/10/01/free-code-for-you/
либо, можно сразу забрать: $ svn checkout http://svn.corkboardinc.com/foodlab/trunk
foodlab

Это приложение, правда, с ипользованием фикстур. И могу предположить,
что местами написано не столь изящно как у Клишина, но уверен, что
новичкам, таким как я, данный пример не будет лишним.


Michael Klishin

не прочитано,
19 нояб. 2007 г., 15:39:2719.11.2007
– ror...@googlegroups.com
Для того чтобы сделать нормальный
пример, нужно часа 4 минимум. Чтобы
сделать хороший скринкаст, надо
попыток так 10. Понятно, что не все они
по 4 часа, но в общем и целом, чтобы
сделать действительно полезную вещь,
надо дожить до отпуска :)

On 19 нояб. 2007, at 15:04, Nexus wrote:

> Миша,
> у вас получился бы замечательный
> скринкаст по использованию спеков (а
> заодно и емакса), который я, как и
> многие другие, с удовольствием бы
> посмотрел.
>
> Попробуете?

MK

Michael Klishin

не прочитано,
19 нояб. 2007 г., 16:17:0119.11.2007
– ror...@googlegroups.com
Не, в этом состоянии в toy rspec app тесты
стремные и мне за них стыдно :) С тех пор
многое поменялось в используемом нами
шаблоне приложения, хелперах для rspec и
все это просто надо привнести в новую
версию toy rspec app.

А пока, хотите посмотреть с пользой для
себя на неплохо написанные спеки —
смотрите спеки Рубиниуса, их там
предостаточно. Заодно освоите git и
сильно улучшите свои познания в
поведении core/stdlib классов самого Ruby.

http://redartisan.com/2007/10/5/rubinius-getting-started
http://redartisan.com/2007/10/11/rubinius-coding

On 19 нояб. 2007, at 15:55, Mihserf wrote:
>
> Это приложение, правда, с
> ипользованием фикстур. И могу
> предположить,
> что местами написано не столь изящно
> как у Клишина, но уверен, что
> новичкам, таким как я, данный пример
> не будет лишним.



MK

Ответить всем
Отправить сообщение автору
Переслать
0 новых сообщений