3

WatirRSpecを介して統合テストを実行しようとしています。そこで、/ Integration内にテストファイルを作成し、factory_girlを介してテストユーザーをベースに追加するテストを作成しました。

問題は、テストユーザーで実際にログインを実行できないことです。私が書いたテストは次のようになります。

...

before(:each)
  @user = Factory(:user)
  @browser = FireWatir::Firefox.new
end

it "should login"
  @browser.text_field(:id, "username").set(@user.username)
  @browser.text_field(:id, "password").set(@user.password)
  @browser.button(:id, "get_in").click
end

...

テストを開始してブラウザに「パフォーマンス」が表示されると、常にUsername is not validエラーが発生します。

私は調査を開始し、小さなトリックを行いました。まず第一に、ファクトリが実際にDBにユーザーを作成するかどうか疑問に思い始めました。そのため、ファクトリをすぐに呼び出した後、ユーザー実際にDBにputs User.findいることを発見するためだけにいくつかのものを入れました。わかりましたが、ユーザーはまだログインできなかったので、自分の目で彼がDBに存在するかどうかを確認することにしました。

sleepファクトリコールの直後に追加し、現在DBに何があるかを見に行きました。ユーザーが実際にそこに行方不明になっているのを見て、私は押しつぶされました!どうして?それでも、コード内でユーザーを出力しようとすると、実際にはどこかからユーザーがフェッチされています。では、ランタイム内でfactory_girlによって作成されたレコードはどこにありますか?それですか、testそれともdevDBですか?理解できません。

testMongrelをモードで実行しているかどうか(統合テストを調整しようとしているので、問題ないと思います)、およびdatabase.yml正しい接続固有のデータを保持しているかどうかを10回チェックしました。

私はauthlogicを使用していますが、それが手がかりを与えることができる場合(いいえ、activate_authlogicここではパッティングは機能しません)。

4

3 に答える 3

4

スペックを実行するとき、RSpec はおそらくトランザクションを使用していることを忘れないでください。RSpec はスペックの実行をトランザクション内にラップし、最後にロールバックします。これは、そのトランザクションの外部 (つまり、別の SQL 接続) からレコードを表示できないことを意味します。

ユーザー レコードが実際に Factory Girl によって作成されていることを確認するには、次のようにします。

before(:each)
  @user = Factory(:user)
  User.find_by_username(@user.username).should_not be_nil
  @browser = FireWatir::Firefox.new
end
于 2010-03-27T17:31:39.770 に答える
2

どういうわけか、解決策はおかしくなりました — 工場を before(:all) ブロックに配置すると、すべてのものは正常に機能しました。

于 2010-03-30T17:59:21.427 に答える
-1

Factory Girlは、テストデータベースに一時的なDBエントリを作成します。テストデータベースは、各テストの後にクリアされます。

于 2010-03-29T13:15:16.067 に答える