Pregunta

Mi controlador es capaz de crear un book_loan niño. Estoy tratando de probar este comportamiento en una prueba funcional, pero estoy teniendo dificultades para usar el método assert_difference. He intentado varias formas de pasar el recuento de book_loans a assert_difference sin suerte.

  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

no se puede convertir en BookLoan cadena

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

NoMethodError: indefinidos método '' para book_loans #

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

no se puede convertir en Proc cadena

assert_difference( lambda{books(:ruby_book).book_loans.count}, :call, 1 )
¿Fue útil?

Solución

Parece que assert_difference espera una cadena, que se eval antes y después del bloque. Así que lo siguiente puede funcionar para usted:

assert_difference('books(:ruby_book).book_loans.count', 1) do
  ...
end

Otros consejos

Yo estaba teniendo problemas con esto también y simplemente descubrió cómo funciona esto. Al igual que el post original, yo también estaba tratando algo como esto:

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

Esto no funciona porque no hay manera para que assert_difference a realizar una acción antes de que se ejecuta el bloque y después de que se ejecuta el bloque.

La razón funciona la cadena es que la cadena puede ser evaluado para determinar si la diferencia esperada como resultado.

Sin embargo, una cadena es una cadena, No código . Creo que un enfoque mejor es pasar algo que puede ser llamada . Envolver la expresión en una lambda hace precisamente eso; que permite assert_difference para llamar al lambda para verificar la diferencia:

assert_difference(lambda { account.users.count }, +1) do                                                                                                       
  invite.accept(another_user)
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top