1

私のコントローラーは子book_loanを作成できます。機能テストでこの動作をテストしようとしていますが、assert_differenceメソッドを使用するのに苦労しています。運が悪かったので、book_loansのカウントをassert_differenceに渡すいくつかの方法を試しました。

  test "should create loan" do
    @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
    assert_difference(books(:ruby_book).book_loans.count, 1) do
      post :loan, {:id => books(:ruby_book).to_param,
                               :book_loan => {:person_id => 1,
                                              :book_id =>
                                                books(:dreaming_book).id}}

    end
  end

BookLoanを文字列に変換できません

assert_difference(books(:ruby_book).book_loans,:count, 1)

NoMethodError:未定義のメソッド'book_loans' for#

assert_difference('Book.book_loans.count', +1)

Procを文字列に変換できません

assert_difference( lambda{books(:ruby_book).book_loans.count}, :call, 1 )
4

2 に答える 2

3

assert_difference は、ブロックの前後で評価される文字列を期待しているようです。したがって、次のことがうまくいく可能性があります。

assert_difference('books(:ruby_book).book_loans.count', 1) do
  ...
end
于 2009-09-26T00:28:13.937 に答える
2

私もこれに問題があり、これがどのように機能するかを理解しました。元の投稿のように、私も次のようなことを試みていました。

# NOTE: this is WRONG, see below for the right way.
assert_difference(account.users.count, +1) do                                                                                                       
  invite.accept(another_user)
end

ブロックを実行する前とブロックを実行した後にアクションassert_differenceを実行する方法がないため、これは機能しません。

文字列が機能する理由は、文字列を評価して、予想される違いが得られたかどうかを判断できるためです。

しかし、文字列は文字列であり、code ではありません。より良いアプローチは、と呼ばれるものを渡すことだと思います。式を a でラップすると、lambdaまさにそれが行われます。assert_differenceラムダを呼び出して違いを確認できます。

assert_difference(lambda { account.users.count }, +1) do                                                                                                       
  invite.accept(another_user)
end
于 2012-09-27T19:32:20.757 に答える