Valer diferencia del número de niños en relación en Ruby on Rails
-
18-09-2019 - |
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 )
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