プラグイン チュートリアル

Version 19 (Haru Iida, 04/10/2010 08:57 am)

1 1 Haru Iida
www.redmine.orgの"Plugin Turorial":http://www.redmine.org/wiki/redmine/Plugin_Tutorial を和訳してみます。
2 1 Haru Iida
3 1 Haru Iida
h1. プラグイン チュートリアル
4 1 Haru Iida
5 6 Haru Iida
注意: このチュートリアルはRedmineの開発リビジョン @r1786@ 以上を対象にしています。
6 1 Haru Iida
7 1 Haru Iida
{{toc}}
8 1 Haru Iida
9 1 Haru Iida
h2. 新しいプラグインを作る。
10 1 Haru Iida
11 1 Haru Iida
プラグインの新規作成はRedmineのプラグインジェネレータを使用して行うことができます。
12 1 Haru Iida
ジェネレータのコマンドは以下です。:
13 1 Haru Iida
14 1 Haru Iida
<pre>ruby script/generate redmine_plugin <plugin_name></pre>
15 1 Haru Iida
16 1 Haru Iida
コマンドプロンプトを開き "cd" であなたがredmineをインストールしたディレクトリに移動し、以下のコマンドを実行してみましょう。:
17 1 Haru Iida
18 1 Haru Iida
  % ruby script/generate redmine_plugin Polls
19 1 Haru Iida
20 2 Haru Iida
@vendor/plugins/redmine_polls@ の下に以下のようなファイルとディレクトリが作られます:
21 1 Haru Iida
22 1 Haru Iida
<pre>
23 1 Haru Iida
      create  vendor/plugins/redmine_polls/app/controllers
24 1 Haru Iida
      create  vendor/plugins/redmine_polls/app/helpers
25 1 Haru Iida
      create  vendor/plugins/redmine_polls/app/models
26 1 Haru Iida
      create  vendor/plugins/redmine_polls/app/views
27 1 Haru Iida
      create  vendor/plugins/redmine_polls/db/migrate
28 1 Haru Iida
      create  vendor/plugins/redmine_polls/lib/tasks
29 1 Haru Iida
      create  vendor/plugins/redmine_polls/assets/images
30 1 Haru Iida
      create  vendor/plugins/redmine_polls/assets/javascripts
31 1 Haru Iida
      create  vendor/plugins/redmine_polls/assets/stylesheets
32 1 Haru Iida
      create  vendor/plugins/redmine_polls/lang
33 1 Haru Iida
      create  vendor/plugins/redmine_polls/README
34 1 Haru Iida
      create  vendor/plugins/redmine_polls/init.rb
35 1 Haru Iida
      create  vendor/plugins/redmine_polls/lang/en.yml
36 1 Haru Iida
</pre>
37 1 Haru Iida
38 2 Haru Iida
@vendor/plugins/redmine_polls/init.rb@ を編集してあなたのプラグインの情報を書き込んでください。(name, author, description および version):
39 1 Haru Iida
40 1 Haru Iida
<pre><code class="ruby">
41 1 Haru Iida
require 'redmine'
42 1 Haru Iida
43 1 Haru Iida
Redmine::Plugin.register :redmine_polls do
44 1 Haru Iida
  name 'Polls plugin'
45 1 Haru Iida
  author 'John Smith'
46 1 Haru Iida
  description 'A plugin for managing polls'
47 1 Haru Iida
  version '0.0.1'
48 1 Haru Iida
end
49 1 Haru Iida
</code></pre>
50 1 Haru Iida
51 2 Haru Iida
そしてRedmineを起動し、ブラウザから次のアドレスを入力します。http://localhost:3000/admin/info.
52 2 Haru Iida
ログイン後、あなたのプラグインがプラグイン一覧に加わっていることが確認できます。
53 1 Haru Iida
54 4 Haru Iida
!plugins_list1.png!
55 1 Haru Iida
56 5 Haru Iida
h2. モデルを作る
57 1 Haru Iida
58 5 Haru Iida
それではこのプラグインのモデルとして Poll を作ってみましょう。:
59 1 Haru Iida
60 1 Haru Iida
  ruby script/generate redmine_plugin_model polls poll question:string yes:integer no:integer
61 1 Haru Iida
62 5 Haru Iida
このコマンドで Poll モデルおよびPollモデルに対応したマイグレーションファイルが作成されます。
63 5 Haru Iida
(訳注:マイグレーションファイルとは、RedmineのDBにこのモデル用のテーブルを作成するためのスクリプトファイルです)
64 1 Haru Iida
65 5 Haru Iida
ここで注意が必要です。timestamped migrationは今のRedmineプラグインエンジンではサポートされていません。ファイル名についているタイムスタンプを"001", "002"のような名前に変更してください。
66 1 Haru Iida
67 5 Haru Iida
実際にデータベースへのマイグレーションを行うためには以下のコマンドを実行します。:
68 1 Haru Iida
69 1 Haru Iida
  rake db:migrate_plugins
70 1 Haru Iida
71 5 Haru Iida
すべてのプラグインはそれぞれに自身のマイグレーションファイルを持っています。
72 1 Haru Iida
73 6 Haru Iida
それではconsoleスクリプトからPollのデータを追加してみましょう。ちゃんとテーブルが作られていることを確認できます。consoleを使用すると対話的にRedmineを動かして確認できます。また、遊びながらいろいろな情報を得ることができます。それでは2つのPollオブジェクトを作ります。
74 1 Haru Iida
75 1 Haru Iida
<pre>
76 1 Haru Iida
script/console
77 1 Haru Iida
>> Poll.create(:question => "Can you see this poll ?")
78 1 Haru Iida
>> Poll.create(:question => "And can you see this other poll ?")
79 1 Haru Iida
>> exit
80 1 Haru Iida
</pre>
81 1 Haru Iida
82 6 Haru Iida
プラグインディレクトリの @vendor/plugins/redmine_polls/app/models/poll.rb@ を編集して #vote メソッドを追加しましょう。このメソッドはコントローラから実行されるものです。:
83 1 Haru Iida
84 1 Haru Iida
<pre><code class="ruby">
85 1 Haru Iida
class Poll < ActiveRecord::Base
86 1 Haru Iida
  def vote(answer)
87 1 Haru Iida
    increment(answer == 'yes' ? :yes : :no)
88 1 Haru Iida
  end
89 1 Haru Iida
end
90 1 Haru Iida
</code></pre>
91 1 Haru Iida
92 7 Haru Iida
h2. コントローラを作成する。
93 1 Haru Iida
94 7 Haru Iida
この段階ではまだこのプラグインは何もすることができません。このプラグインにコントローラを追加してみましょう。コントローラの作成にはプラグインコントローラジェネレータを使用できます。文法は以下です。:
95 1 Haru Iida
96 1 Haru Iida
<pre>ruby script/generate redmine_plugin_controller <plugin_name> <controller_name> [<actions>]</pre>
97 1 Haru Iida
98 7 Haru Iida
ではコマンドプロンプトから以下のように打ってみましょう。:
99 1 Haru Iida
100 1 Haru Iida
<pre>
101 1 Haru Iida
% ruby script/generate redmine_plugin_controller Polls polls index vote
102 1 Haru Iida
      exists  app/controllers/
103 1 Haru Iida
      exists  app/helpers/
104 1 Haru Iida
      create  app/views/polls
105 1 Haru Iida
      create  test/functional/
106 1 Haru Iida
      create  app/controllers/polls_controller.rb
107 1 Haru Iida
      create  test/functional/polls_controller_test.rb
108 1 Haru Iida
      create  app/helpers/polls_helper.rb
109 1 Haru Iida
      create  app/views/polls/index.html.erb
110 1 Haru Iida
      create  app/views/polls/vote.html.erb
111 1 Haru Iida
</pre>
112 1 Haru Iida
113 7 Haru Iida
コントローラ @PollsController@ と2つのアクション (@#index@ and @#vote@) が作成されます。
114 1 Haru Iida
115 7 Haru Iida
@vendor/plugins/redmine_polls/app/controllers/polls_controller.rb@ を編集して 2つのアクションを実装します。
116 1 Haru Iida
117 1 Haru Iida
<pre><code class="ruby">
118 1 Haru Iida
class PollsController < ApplicationController
119 1 Haru Iida
  unloadable
120 1 Haru Iida
121 1 Haru Iida
  def index
122 1 Haru Iida
    @polls = Poll.find(:all)
123 1 Haru Iida
  end
124 1 Haru Iida
125 1 Haru Iida
  def vote
126 1 Haru Iida
    poll = Poll.find(params[:id])
127 1 Haru Iida
    poll.vote(params[:answer])
128 1 Haru Iida
    if poll.save
129 1 Haru Iida
      flash[:notice] = 'Vote saved.'
130 1 Haru Iida
      redirect_to :action => 'index'
131 1 Haru Iida
    end
132 1 Haru Iida
  end
133 1 Haru Iida
end
134 1 Haru Iida
</code></pre>
135 1 Haru Iida
136 8 Haru Iida
そして @vendor/plugins/redmine_polls/app/views/polls/index.html.erb@ を編集すると先ほど作成した2つのpollを表示できます。:
137 1 Haru Iida
138 1 Haru Iida
139 1 Haru Iida
<pre>
140 1 Haru Iida
<h2>Polls</h2>
141 1 Haru Iida
142 1 Haru Iida
<% @polls.each do |poll| %>
143 1 Haru Iida
  <p>
144 1 Haru Iida
  <%= poll[:question] %>?
145 1 Haru Iida
  <%= link_to 'Yes', {:action => 'vote', :id => poll[:id], :answer => 'yes'}, :method => :post %> (<%= poll[:yes] %>) /
146 1 Haru Iida
  <%= link_to 'No', {:action => 'vote', :id => poll[:id], :answer => 'no'}, :method => :post %> (<%= poll[:no] %>)
147 1 Haru Iida
  </p>
148 1 Haru Iida
<% end %>
149 1 Haru Iida
</pre>
150 1 Haru Iida
151 8 Haru Iida
@vendor/plugins/redmine_polls/app/views/polls/vote.html.erb@ は対応するactionから使われることがないので削除してよいです。
152 1 Haru Iida
153 8 Haru Iida
さあ、Redmineを再起動してブラウザから http://localhost:3000/polls にアクセスしましょう。
154 8 Haru Iida
2つのpollが確認でき、それらに投票することができるでしょう。:
155 1 Haru Iida
156 8 Haru Iida
!pools1.png!
157 1 Haru Iida
158 18 Haru Iida
もしRedmineをプロダクションモードで動かしていない場合、pollの結果はリクエスト毎にリセットされます。これは今回の例ではpollモデルをclass変数に格納しているためです。
159 1 Haru Iida
160 9 Haru Iida
h2. メニューを拡張する。
161 1 Haru Iida
162 9 Haru Iida
コントローラは動くようになりましたが、このままではユーザはURLを知らない限り投票画面を見ることができません。RedmineのプラグインAPIを使用するとメニューを拡張できます。アプリケーションメニューに新しい項目を追加してみましょう。
163 1 Haru Iida
164 9 Haru Iida
h3. アプリケーションメニューを拡張する。
165 1 Haru Iida
166 9 Haru Iida
@vendor/plugins/redmine_polls/init.rb@ を編集してplugin registration blockの最後に以下の行を追加してください。:
167 1 Haru Iida
168 1 Haru Iida
<pre><code class="ruby">
169 1 Haru Iida
Redmine::Plugin.register :redmine_polls do
170 1 Haru Iida
  [...]
171 1 Haru Iida
  
172 1 Haru Iida
  menu :application_menu, :polls, { :controller => 'polls', :action => 'index' }, :caption => 'Polls'
173 1 Haru Iida
end
174 1 Haru Iida
</code></pre>
175 1 Haru Iida
176 9 Haru Iida
文法は以下です。:
177 1 Haru Iida
178 1 Haru Iida
  menu(menu_name, item_name, url, options={})
179 1 Haru Iida
180 9 Haru Iida
拡張できるメニューは4種類です。:
181 1 Haru Iida
182 9 Haru Iida
* @:top_menu@ - 最上部の左側のメニュー。
183 9 Haru Iida
* @:account_menu@ - 最上部の右側のメニュー。ログイン/ログアウトがある。
184 9 Haru Iida
* @:application_menu@ - プロジェクトの外でのメインメニュー。
185 9 Haru Iida
* @:project_menu@ - プロジェクト内でのメインメニュー。
186 1 Haru Iida
187 9 Haru Iida
以下のオプションが使えます。:
188 1 Haru Iida
189 9 Haru Iida
* @:param@ - プロジェクトIDを渡すのに用いられる変数のキー。 (デフォルトは @:id@)
190 9 Haru Iida
* @:if@ - メニュー項目のレンダリング前に呼ばれるProc。メニュー項目はこのProcの戻りがtrueの場合にのみ表示される。
191 9 Haru Iida
* @:caption@ - メニューのキャプション。以下が使えます。:
192 1 Haru Iida
193 9 Haru Iida
  * ローカライズ文字列用シンボル
194 9 Haru Iida
  * 文字列
195 9 Haru Iida
  * projectを引数としたProc
196 1 Haru Iida
197 9 Haru Iida
* @:before@, @:after@ - メニューを挿入する場所の指定 (例 @:after => :activity@ 訳注:「活動」ページの後ろに挿入される)
198 9 Haru Iida
* @:last@ - trueに設定するとメニューの最後に追加される。 (例 @:last => true@)
199 9 Haru Iida
* @:html_options@ - html オプションのHash。メニュー表示時の @link_to@ に渡される。訳注: @link_to@はRailsのAPI
200 1 Haru Iida
201 9 Haru Iida
今回の例ではメニュー項目をアプリケーションメニューに追加します。アプリケーションメニューはデフォルトでは空です。
202 9 Haru Iida
Redmineを再起動して http://localhost:3000 にアクセスしてみましょう。:
203 1 Haru Iida
204 9 Haru Iida
!application_menu.png!
205 1 Haru Iida
206 9 Haru Iida
ようこそ画面のPollsタブをクリックして投票画面に行けるはずです。
207 1 Haru Iida
208 10 Haru Iida
h3. プロジェクトメニューを拡張する。
209 1 Haru Iida
210 10 Haru Iida
さあ、今度はpollsをプロジェクト用プラグインとした場合の例です。(今回のpollモデルはそう設計されてませんが)。Pollsタブをプロジェクトメニューに追加しましょう。
211 10 Haru Iida
@init.rb@ を開いて先ほど追加した行を以下の2行に書き換えてください。:
212 1 Haru Iida
213 1 Haru Iida
<pre><code class="ruby">
214 1 Haru Iida
Redmine::Plugin.register :redmine_polls do
215 1 Haru Iida
  [...]
216 1 Haru Iida
217 1 Haru Iida
  permission :polls, {:polls => [:index, :vote]}, :public => true
218 1 Haru Iida
  menu :project_menu, :polls, { :controller => 'polls', :action => 'index' }, :caption => 'Polls', :after => :activity, :param => :project_id
219 1 Haru Iida
end
220 1 Haru Iida
</code></pre>
221 1 Haru Iida
222 10 Haru Iida
2行目がプロジェクトメニューにPollsタブを追加する定義です。活動タブのすぐ後ろに追加します。
223 10 Haru Iida
最初の行は @PollsController@ の2つのアクションをpulicにするための設定です。詳細については後ほど説明します。
224 1 Haru Iida
225 10 Haru Iida
Redmineを再起動し、プロジェクトを表示します。:
226 1 Haru Iida
227 11 Haru Iida
!project_menu.png!
228 1 Haru Iida
229 12 Haru Iida
Pollsタブをクリックしてください。プロジェクトメニューが消えてしまうことに気付きましたか?
230 12 Haru Iida
プロジェクトメニューを表示しておくためにはコントローラのインスタンス変数 @@project@ を設定してあげる必要があります。
231 1 Haru Iida
232 12 Haru Iida
PollsController を以下のように編集します。:
233 1 Haru Iida
234 1 Haru Iida
<pre><code class="ruby">
235 1 Haru Iida
def index
236 1 Haru Iida
  @project = Project.find(params[:project_id])
237 1 Haru Iida
  @polls = Poll.find(:all) # @project.polls
238 1 Haru Iida
end
239 1 Haru Iida
</code></pre>
240 1 Haru Iida
241 12 Haru Iida
プロジェクトIDはparamの中の @:project_id@ に格納されています。なぜなら先ほどのメニューの定義で @:param => :project_id@ と設定したからです。
242 1 Haru Iida
243 12 Haru Iida
さあ、これでPollsタブをクリックしてもプロジェクトメニューが消えなくなりました。:
244 1 Haru Iida
245 13 Haru Iida
!project_menu_pools.png!
246 1 Haru Iida
247 13 Haru Iida
h2. パーミッションを定義する。
248 1 Haru Iida
249 14 Haru Iida
この状態ではすべての人が投票を行うことができます。ではパーミッションの定義をしてみましょう。
250 14 Haru Iida
ここでは2種類のプロジェクトベースのパーミッションを定義します。ひとつはpollsの表示に関するもの、もう一つは投票に関するものです。これを行うと、パーミッションはpublicでは無くなります。(@:public => true@ オプションは削除します).
251 1 Haru Iida
252 14 Haru Iida
@vendor/plugins/redmine_polls/init.rb@ を編集して先ほどのパーミッション定義を以下の2行に置き換えます。:
253 1 Haru Iida
254 1 Haru Iida
<pre><code class="ruby">
255 1 Haru Iida
256 1 Haru Iida
  permission :view_polls, :polls => :index
257 1 Haru Iida
  permission :vote_polls, :polls => :vote
258 1 Haru Iida
</code></pre>
259 1 Haru Iida
260 1 Haru Iida
261 14 Haru Iida
Redmineを再起動して次のURLにアクセスしてみましょう。 http://localhost:3000/roles/report:
262 1 Haru Iida
263 15 Haru Iida
!permissions1.png!
264 1 Haru Iida
265 14 Haru Iida
これで既存のロールに対してパーミッションを設定できるようになりました。
266 1 Haru Iida
267 14 Haru Iida
もちろん、パーミッションに応じてユーザのアクセス制御を行うためにはPollsControllerにコードを追加する必要があります。
268 1 Haru Iida
269 14 Haru Iida
今回の場合は @:authorize@ フィルターを追加すること、およびこのフィルターが呼ばれる前に必ず @project に値がセットされるようにするだけです。
270 14 Haru Iida
271 14 Haru Iida
@#index@ アクションでは以下のようにします。:
272 1 Haru Iida
273 1 Haru Iida
<pre><code class="ruby">
274 1 Haru Iida
class PollsController < ApplicationController
275 1 Haru Iida
  unloadable
276 1 Haru Iida
  
277 1 Haru Iida
  before_filter :find_project, :authorize, :only => :index
278 1 Haru Iida
279 1 Haru Iida
  [...]
280 1 Haru Iida
  
281 1 Haru Iida
  def index
282 1 Haru Iida
    @polls = Poll.find(:all) # @project.polls
283 1 Haru Iida
  end
284 1 Haru Iida
285 1 Haru Iida
  [...]
286 1 Haru Iida
  
287 1 Haru Iida
  private
288 1 Haru Iida
  
289 1 Haru Iida
  def find_project
290 1 Haru Iida
    # @project variable must be set before calling the authorize filter
291 1 Haru Iida
    @project = Project.find(params[:project_id])
292 1 Haru Iida
  end
293 1 Haru Iida
end
294 1 Haru Iida
</code></pre>
295 1 Haru Iida
296 16 Haru Iida
@#vote@ アクションが動く前に現在のプロジェクトを取得します。これを行うと、投票は管理者もしくはこのプロジェクトの許可されたロールのユーザ以外行えなくなります。
297 1 Haru Iida
298 1 Haru Iida
299 16 Haru Iida
h2. プロジェクトモジュールを作る。
300 1 Haru Iida
301 16 Haru Iida
今現在、pollの機能はすべてのプロジェクトに追加されています。しかし、pollsを限られたプロジェクトのみに使わせたい場合もあるでしょう。
302 16 Haru Iida
ここでは 'Polls' プロジェクトモジュールを作成します. これはパーミッション定義を @#project_module@ 定義で囲むことによって実現します。
303 1 Haru Iida
304 16 Haru Iida
@init.rb@ を編集してパーミッションの定義を変更します。:
305 16 Haru Iida
306 1 Haru Iida
<pre><code class="ruby">
307 1 Haru Iida
  project_module :polls do
308 1 Haru Iida
    permission :view_polls, :polls => :index
309 1 Haru Iida
    permission :vote_polls, :polls => :vote
310 1 Haru Iida
  end
311 1 Haru Iida
</code></pre>
312 1 Haru Iida
313 16 Haru Iida
Redmineを再起動し、適当なプロジェクトの設定メニューを開きます。そしてモジュールタブをクリックします。するとモジュールリストの最後にPolls moduleがあることが確認できます。 (デフォルトではチェックはついていません):
314 1 Haru Iida
315 16 Haru Iida
!modules.png!
316 1 Haru Iida
317 17 Haru Iida
これでプロジェクト毎にPollsの有効・無効を選択できるようになりました。
318 1 Haru Iida
319 17 Haru Iida
h2. プラグインの表示を拡張する。
320 1 Haru Iida
321 17 Haru Iida
h3. スタイルシートを追加する。
322 1 Haru Iida
323 17 Haru Iida
それではプラグインのviewにスタイルシートを追加してみましょう。
324 17 Haru Iida
@voting.css@ というファイルを @vendor/plugins/redmine_polls/assets/stylesheets@ に作成してください。:
325 1 Haru Iida
326 1 Haru Iida
<pre>
327 1 Haru Iida
a.vote { font-size: 120%; }
328 1 Haru Iida
a.vote.yes { color: green; }
329 1 Haru Iida
a.vote.no  { color: red; }
330 1 Haru Iida
</pre>
331 1 Haru Iida
332 17 Haru Iida
Redmineを再起動すると、assetsの下はRails Enginesによって自動的に @public/plugin_assets/redmine_polls/@ にコピーされます。これによってWebブラウザからこれらのファイルにアクセスできるようになります。なのでassetsの下のスタイルシートやJavascriptに変更を加えた場合には必ずRedmineの再起動が必要になります。
333 1 Haru Iida
334 17 Haru Iida
@vendor/plugins/redmine_polls/app/views/polls/index.html.erb@ に以下の行を加えてください。するとスタイルシートがRedmineのヘッダーからインクルードされます。:
335 1 Haru Iida
336 1 Haru Iida
<pre>
337 1 Haru Iida
<% content_for :header_tags do %>
338 1 Haru Iida
    <%= stylesheet_link_tag 'voting', :plugin => 'redmine_polls' %>
339 1 Haru Iida
<% end %>
340 1 Haru Iida
</pre>
341 1 Haru Iida
342 17 Haru Iida
@:plugin => 'redmine_polls'@ オプションを @stylesheet_link_tag@ ヘルパーに渡します。
343 1 Haru Iida
344 17 Haru Iida
Javascript をプラグインのビューからインクルードするためには@javascript_include_tag@ ヘルパーを同様に使います。
345 1 Haru Iida
346 17 Haru Iida
h3. ページタイトルを設定する。
347 1 Haru Iida
348 17 Haru Iida
プラグインのviewにHTMLのタイトルを設定するには @html_title@ ヘルパーを使います。
349 17 Haru Iida
例:
350 1 Haru Iida
351 1 Haru Iida
  <% html_title "Polls" -%>
352 19 Haru Iida
353 19 Haru Iida
h2. プラグインをテストする
354 19 Haru Iida
355 19 Haru Iida
h3. test/test_helper.rb:
356 19 Haru Iida
357 19 Haru Iida
テストヘルパーファイルの中に以下のように記述します。:
358 19 Haru Iida
359 19 Haru Iida
<pre>
360 19 Haru Iida
require File.expand_path(File.dirname(__FILE__) + '/../../../../test/test_helper')
361 19 Haru Iida
</pre>
362 19 Haru Iida
363 19 Haru Iida
h3. テストのサンプル:
364 19 Haru Iida
365 19 Haru Iida
#訳注:これ以後、本家のチュートリアルに追記されたテストに関する記述の訳ですが、ここまでと書いた人が違うようです。サンプルコードもPollsプラグインでは無くなってます。
366 19 Haru Iida
367 19 Haru Iida
requirements_controller_test.rb:
368 19 Haru Iida
369 19 Haru Iida
<pre>
370 19 Haru Iida
require File.dirname(__FILE__) + '/../test_helper'
371 19 Haru Iida
require 'requirements_controller'
372 19 Haru Iida
373 19 Haru Iida
class RequirementsControllerTest < ActionController::TestCase
374 19 Haru Iida
  fixtures :projects, :versions, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details,
375 19 Haru Iida
           :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages,
376 19 Haru Iida
           :attachments, :custom_fields, :custom_values, :time_entries
377 19 Haru Iida
378 19 Haru Iida
  def setup
379 19 Haru Iida
    @skill = Skill.new(:skill_name => 'Java')
380 19 Haru Iida
    @project = Project.find(1)
381 19 Haru Iida
    @request    = ActionController::TestRequest.new
382 19 Haru Iida
    @response   = ActionController::TestResponse.new
383 19 Haru Iida
    User.current = nil
384 19 Haru Iida
  end
385 19 Haru Iida
386 19 Haru Iida
  def test_routing
387 19 Haru Iida
    assert_routing(
388 19 Haru Iida
      {:method => :get, :path => '/requirements'},
389 19 Haru Iida
      :controller => 'requirements', :action => 'index'
390 19 Haru Iida
    )
391 19 Haru Iida
  end
392 19 Haru Iida
</pre>
393 19 Haru Iida
394 19 Haru Iida
h3. テスト用 DBを初期化する。:
395 19 Haru Iida
396 19 Haru Iida
以下のようなrake コマンドを実行することにより、テスト用DBを初期化することができます。:
397 19 Haru Iida
398 19 Haru Iida
<pre>
399 19 Haru Iida
rake db:drop:all db:create:all db:migrate db:migrate_plugins redmine:load_default_data RAILS_ENV=test
400 19 Haru Iida
</pre>
401 19 Haru Iida
402 19 Haru Iida
403 19 Haru Iida
h3. テストを実行する:
404 19 Haru Iida
405 19 Haru Iida
reqruirements_controller_test.rb のテストを行うには以下のコマンドを実行します。:
406 19 Haru Iida
407 19 Haru Iida
<pre>
408 19 Haru Iida
rake test:engines:all PLUGIN=redmine_requirements
409 19 Haru Iida
</pre>
410 19 Haru Iida
411 19 Haru Iida
h3. ユーザおよびプロジェクトと共にテストする。
412 19 Haru Iida
413 19 Haru Iida
あなたのプラグインがプロジェクトメンバでなければ操作できない場合、functional testの最初に以下の記述を追加します。:
414 19 Haru Iida
415 19 Haru Iida
<pre>
416 19 Haru Iida
def setup
417 19 Haru Iida
  @request    = ActionController::TestRequest.new
418 19 Haru Iida
  @response   = ActionController::TestResponse.new
419 19 Haru Iida
  User.current = nil
420 19 Haru Iida
end
421 19 Haru Iida
422 19 Haru Iida
def test_index
423 19 Haru Iida
  @request.session[:user_id] = 2
424 19 Haru Iida
  get :index, :project_id => 1
425 19 Haru Iida
  assert_response :success
426 19 Haru Iida
  assert_template :index
427 19 Haru Iida
end
428 19 Haru Iida
</pre>
429 19 Haru Iida
430 19 Haru Iida
この方法が正しいのはよく判りませんが、とりあえず正しく動いているように見えます。 :S