0

私はルビー/レールが初めてで、チュートリアルを行っています。小さな問題をどのように解決できるか疑問に思っていました...

ユーザーが有効な情報でサインインしたときに何が起こるべきか、何が起こらないべきかをテストする「有効な情報付き」の記述があります。この手順では、新しいページにいくつかのリンクが存在することを確認できるようにしたいと考えています。チュートリアルでは、リンクが 2 つしかないので、次のようにします。

it { should have_link('Profile', href: user_path(user)) }
it { should have_link('Sign out', href: signout_path) }

しかし、たとえば 10 個のリンクがあるとしたらどうでしょうか。ヘルパーがいる方が楽だと思いませんか?しかし、私はそれを書く方法を理解できません。これは私が持ってきたものです...

 lol = Hash[ 'Profile'  => 'user_path(user)',
             'Sign out' => 'signin_path']
 it { should have_list_of_links(lol) }

次に $PROJECT/spec/support/utilities.rb ファイルで、新しい *have_list_of_links* 関数を定義します。

RSpec::Matchers.define :have_list_of_links do |lol|
  match do |page|
    lol.each_pair do |label, link| 
                page.should have_link(label, href: link) 
    end
  end
end

それが正しい方法ではないことはわかっていますが、それを行う方法がわかりません...

ありがとう。

4

1 に答える 1

1

ここには 2 つの小さな問題があります。最初にlet構文を使用して、rspec 内でメモ化された変数を定義します。次に、ハッシュを作成するときに*_pathヘルパーを囲む括弧を削除します。

そのため、次のように述べています。

lol = Hash[ 'Profile'  => 'user_path(user)',
            'Sign out' => 'signin_path']

持ってる:

let(:lol) { Hash[ 'Profile'  => user_path(user),
                  'Sign out' => signin_path] }

説明ブロックは次のようになります。

describe "with valid information" do
  let(:lol) { Hash[ 'Profile'  => user_path(user),
                    'Sign out' => signin_path] }

  it { should have_list_of_links(lol) }
end

副作用として、小さな例を示します。$PROJECT/spec/support/utilities.rbファイルでマッチャーが定義されている場合、アプリケーション ルートなどが正しく設定され、ビューにリンクが表示されます。

describe "Users pages" do
  before { visit root_path }
  let(:values) { Hash['Index' => users_path, 
                      'Sign out' => signout_path, 
                      'Sign in' => signin_path] }

  subject { page }

  describe "with valid informations" do
    it { should have_list_of_links(values) }
  end
end  

rspec の実行:

> rspec
.

Finished in 0.00267 seconds
1 example, 0 failures

Randomized with seed 67346

rspec -f ドキュメントの実行

>rspec -f documentation
Users pages
  with valid informations
    should have link "Sign in"

Finished in 0.00049 seconds
1 example, 0 failures

Randomized with seed 53331

これは明確ではなく、誤解を招く可能性があります。特にドキュメンテーション スイッチです。新しいアプリケーションで rspec -f ドキュメントを実行するのが一般的な方法です (rspec ofc を使用している場合)。何が起こっているのかをよりよく理解するために。

代わりに次の場合:

describe "Users pages" do
  before { visit root_path }

  subject { page }

  describe "with valid informations" do
    it { should have_link('Index', href: users_path) }
    it { should have_link('Sign out', href: signout_path) }
    it { should have_link('Sign in', href: signout_path) }
  end
end  

rspec の実行:

>rspec
...

Finished in 0.0097 seconds
3 examples, 0 failures

Randomized with seed 53347

rspec -f ドキュメントの実行

>rspec -f documentation
Users pages
  with valid informations
    should have link "Index"
    should have link "Sign out"
    should have link "Sign in"

Finished in 0.00542 seconds
3 examples, 0 failures

Randomized with seed 40120

個人的には 2 番目のケース (より冗長なケース) が好きです。テストの数が増え、テスト構造がより複雑になると、その価値が高まります。rspec -f documentationを実行するだけで、ユーザー マニュアルやチュートリアルに行かなくても、アプリケーションの使用方法を学ぶことができます。

于 2013-03-20T11:08:44.537 に答える