ガイド:人々のためのピラミッド-パート4

パート3:ユニットおよび機能テスト、カメレオンのHello World



ステップ04:フレームワークを表示する


「hello world」で十分です。次に、Projectorでの作業に取り掛かりましょう。 UX担当者は通常、プロトタイプを作成してURL構造で表示する必要がある多くのビューを持っています。



このプロセスを迅速かつ生産的にしたいと考えています。



この手順では、次のようにサイトマップの構造をコピーします。

/

/about.html

/acme

/people




/

/about.html

/acme

/people




...そして、これを行う一連のURLを作成します。 その過程で、より多くのビューとテンプレートを作成します。



目標
期待されること
手順


$ cd ../../creatingux; mkdir step04; cd step04







(変更なし)コピーstep04/application.py



:

wsgiref.simple_server import make_server から



pyramid.config import Configurator から



def main ():

config = Configurator()

config スキャン( "ビュー" )

app = config make_wsgi_app()

アプリを返す



__name__ == '__main__'の場合 :

app = main()

server = make_server( '0.0.0.0' 、 8080 、app)

サーバー serve_forever()

さらに、 step04/views.py



もあります。

pyramid.view から view_configを インポートします



@view_config (レンダラー= "index.pt" )

def index_view (リクエスト):

{}を返す



@view_config (レンダラー= "about.pt" 、名前= "about.html" )

def about_view (リクエスト):

{}を返す



@view_config (レンダラー= "company.pt" 、名前= "acme" )

def company_view (リクエスト):

return { "company" :COMPANY、 "projects" :PROJECTS}



@view_config (レンダラー= "people.pt" 、名前= "people" )

def people_view (リクエスト):

return { "company" :COMPANY、 "people" :PEOPLE}



#ダミーデータ

COMPANY = "ACME、Inc."



PEOPLE = [

{ 「名前」 : 「スタントン」 、 「タイトル」 : 「スーザンスタントン」 }、

{ 'name' : 'bbarker' 、 'title' : 'Bob Barker' }、

]



プロジェクト= [

{ 「名前」 : 「sillyslogans」 、 「タイトル」 : 「Silly Slogans」 }、

{ 「名前」 : 「意味のない ミッション」 、 「タイトル」 : 「意味のないミッション」 }、

]

そして、これがstep04/index.pt



です:

<html>

<head>

<title>プロジェクター-ホーム</ title>

</ head>

<本体>

<ul>

<li> <a href= "/">ホーム</a> </ li>

<li> <a href= "/about.html">プロジェクタについて</a> </ li>

<li> <a href= "/acme"> ACME、Inc. </a> </ li>

<li> <a href= "/people">人々 </a> </ li>

</ ul>

<h1>プロジェクター-ホーム</ h1>

</ body>

</ html>

さらにここにstep04/about.pt



ます。

<html>

<head>

<title>プロジェクタ-概要</ title>

</ head>

<本体>

<ul>

<li> <a href= "/">ホーム</a> </ li>

<li> <a href= "/about.html">プロジェクタについて</a> </ li>

<li> <a href= "/acme"> ACME、Inc. </a> </ li>

<li> <a href= "/people">人々 </a> </ li>

</ ul>

<h1>プロジェクター-概要</ h1>

<p>プロジェクターは、ホスティングが可能なシンプルなプロジェクト管理ツールです

複数の独立企業のための複数のプロジェクト、

独立企業間で開発者プールを共有します。 </ p>

</ body>

</ html>

これがstep04/company.pt



です。

<html>

<head>

<title>プロジェクター-人</ title>

</ head>

<本体>

<ul>

<li> <a href= "/">ホーム</a> </ li>

<li> <a href= "/about.html">プロジェクタについて</a> </ li>

<li> <a href= "/acme"> ACME Inc. </a> </ li>

<li> <a href= "/people">人々 </a> </ li>

</ ul>

<h1>人</ h1>

<ul>

< リテラル:repeat = "person people" >

<a href= "${person.name}"> $ {person.title} </a>

</ li>

</ ul>

</ body>

</ html>

そして最後に、ここにstep04/tests.py



ます:

インポート unittest



クラス ProjectorViewsUnitTests (unittest。TestCase):

def test_hello_view ( self ):

ビュー から インポート index_view

結果= index_view({})

自己 。 assertEqual( len (result。keys())、 0 )



def test_about_view ( self ):

ビュー から インポート about_view

結果= about_view({})

自己 。 assertEqual( len (result。keys())、 0 )



def test_company_view ( self ):

ビュー から import company_view

結果= company_view({})

自己 。 assertEqual(結果[ "会社" ]、 "ACME、Inc." )

自己 。 assertEqual( len (result [ "projects" ])、 2 )



def test_people_view ( self ):

ビュー から インポート people_view

結果= people_view({})

自己 。 assertEqual(結果[ "会社" ]、 "ACME、Inc." )

自己 。 assertEqual( len (result [ "people" ])、 2 )



クラス ProjectorFunctionalTests (unittest。TestCase):

def setUp ( self ):

アプリケーションの インポート からメイン

app = main()

webtest インポート TestApp から

自己 。 testapp = TestApp(アプリ)



def test_home ( self ):

res = self testapp 。 get( '/' 、ステータス= 200 )

自己 。 failUnless(res。bodyの'Home' )



def test_it ( self ):

res = self testapp 。 get( '/' 、ステータス= 200 )

自己 。 failUnless(res。bodyの'Home' )

res = self testapp 。 get( '/about.html' 、ステータス= 200 )

自己 。 failUnless(res。bodyの「自律」 )

res = self testapp 。 get( '/ people' 、ステータス= 200 )

自己 。 failUnless(res。bodyの「スーザン」 )

res = self testapp 。 get( '/ acme' 、ステータス= 200 )

自己 。 failUnless( res。bodyの「Silly Slogans」 )

それから私達は書く

$ nosetests





これにより、6つのテストに関するレポートが提供されます。

アプリケーションを起動します。

$ python application.py





そして、ブラウザの結果に満足しています127.0.0.1:8080







追加の質問


@ name属性のないビュー登録が2つある場合、つまり両方がデフォルトとして登録されている場合はどうなりますか?

Chameleon(現在、2番目のバージョンについて話している場合)は、いずれにしてもエラーメッセージを提供する方が良いというのは本当ですか? Pythonの式にいくつかのバグを入れて、これを試してください。

WebTestはこれらのエラーに正しく応答しますか?

URLに.htmlを追加すると、何か影響がありますか?



分析


アプリケーションのオブジェクトと階層にマップするURLのスペースを構築するプロセスを開始しました。 現時点では、表現を使用してこれをモデル化しました。



テストの数は増えましたが、それぞれがまだ非常に小さいです。 そのような単純なテストでさえ、初期の開発プロセス中にポップアップするほとんどの愚かなエラーをキャッチします。 クリックするだけでなく、ノーズテストの生産性が高まることを願っています。



アブストラクト


登録は内部でどのように行われますか?

カメレオン、キャッシング、既製バージョンのディスクへの格納



ステップ05: マスターテンプレートの作成



All Articles