Estou testando uma requisição JSON para nossa API, ela responderá com JSON. Parece que todos os booleanos dentro do JSON são convertidos em strings à medida que os postamos no endpoint apenas no ambiente de teste.
No entanto RAILS_ENV=development bundle exec guard
funciona bem (sem conversão), mas uma vez RAILS_ENV=test bundle exec guard
converte todo o booleano para string , o que é inesperado.
Este é o meu caso de teste usando mock.
it 'create proration item' do
# guess need to create a dummy account with stripe_customer_id
account = create(:account, stripe_customer_id: 'cus_00000000000000')
invoice = create(:invoice, stripe_invoice_id: 'in_00000000000000' )
# create a plan
plan = create(:plan)
stripe_helper.create_plan(id: plan.stripe_plan_id)
Stripe::InvoiceItem.create(
amount: 300,
currency: 'jpy',
description: "#{300} charged",
proration: true,
type: 'invoiceitem'
)
item_objs = Stripe::InvoiceItem.list(:limit => 10)
# create a event mock based on objs above
event = StripeMock.mock_webhook_event('invoice.payment_succeeded', {
id: invoice.stripe_invoice_id,
lines: item_objs,
customer: account.stripe_customer_id
})
# Mocking up private method :fetch_invoice_details
balance_txn = Stripe::BalanceTransaction.retrieve('txn_05RsQX2eZvKYlo2C0FRTGSSA')
allow_any_instance_of(InvoicePaymentSucceeded).to receive(:fetch_invoice_details).and_return(balance_txn)
# when it's false (This should be changed depending on cases). Here we don't test private method.
allow_any_instance_of(InvoicePaymentSucceeded).to receive(:initial_invoice?).and_return(false)
post '/stripe-events', event.as_json
expect(response.status).to eq 200
end
Dentro do manipulador de ponto final, pude ver os valores abaixo.
Abaixo **test environment**
,
#<Stripe::Event:0x3fe2ea57e95c id=test_evt_2> JSON: {
"id": "test_evt_2",
"created": "1326853478",
"livemode": "false",
"type": "invoice.payment_succeeded",
"object": "event",
"data": {"object":{"id":"in_00000000000000","date":"1394018368","period_start":"1394018368","period_end":"1394018368","lines":{"object":"list","data":[{"id":"test_ii_1","object":"invoiceitem","date":"1349738920","amount":"300","livemode":"false","proration":"true","currency":"jpy","customer":"cus_test","description":"300 charged","invoice":null,"subscription":null,"type":"invoiceitem"}],"url":"/v1/hashs","has_more":"false"},"subtotal":"30000","total":"30000","customer":"cus_00000000000000","object":"invoice","attempted":"true","closed":"true","paid":"true","livemode":"false","attempt_count":"1","amount_due":"0","currency":"usd","starting_balance":"0","ending_balance":"0","next_payment_attempt":null,"charge":"ch_00000000000000","discount":null,"application_fee":null,"subscription":"su_00000000000000","description":null}},
"controller": "stripe_event/webhook",
"action": "event"
}
Abaixo **development environment**
,
#<Stripe::Event:0x3fce66d141f0 id=test_evt_2> JSON: {
"id": "test_evt_2",
"created": 1326853478,
"livemode": false,
"type": "invoice.payment_succeeded",
"object": "event",
"data": {"object":{"id":"in_00000000000000","date":1394018368,"period_start":1394018368,"period_end":1394018368,"lines":{"object":"list","data":[{"id":"test_ii_1","object":"invoiceitem","date":1349738920,"amount":300,"livemode":false,"proration":true,"currency":"jpy","customer":"cus_test","description":"300 charged","metadata":{},"invoice":null,"subscription":null,"type":"invoiceitem"}],"url":"/v1/hashs","has_more":false},"subtotal":30000,"total":30000,"customer":"cus_00000000000000","object":"invoice","attempted":true,"closed":true,"paid":true,"livemode":false,"attempt_count":1,"amount_due":0,"currency":"usd","starting_balance":0,"ending_balance":0,"next_payment_attempt":null,"charge":"ch_00000000000000","discount":null,"application_fee":null,"subscription":"su_00000000000000","metadata":{},"description":null}}
}
Alguma idéia sobre armadilhas no ambiente de teste sob teste?
as_json
retorna um hash, que está sendo convertido em parâmetros de string para o controlador, este é o comportamento esperado do Rails (não o adulteramos), use to_json
.
@JonRowe Eu só me pergunto por que isso aconteceu apenas no ambiente test
. Alguma ideia?
Porque sua postagem Json não é um hash no dev
Em sex, 25 de novembro de 2016 às 12:55, Toshiki Inami [email protected]
escrevi:
@JonRowe https://github.com/JonRowe Eu só me pergunto por que isso aconteceu
apenas em ambiente de teste. Alguma ideia?—
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/rspec/rspec-rails/issues/1755#issuecomment-262865864 ,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/AAJ8oFzIiZC0o1j1fZqUeNvrf4q4o4Ruks5rBkAHgaJpZM4K7muV
.
Estou um pouco confuso…
Por que apenas no ambiente de teste ele é postado em hash? Esse é o comportamento esperado do Rails?
(Ambos os casos de teste são exatamente os mesmos.)
Os valores retornados de event.as_json
são exatamente os mesmos em test
e development
.
Porque seu teste está enviando um hash, mas um navegador real / js envia json
Em sex, 25 de novembro de 2016 às 14:02, Toshiki Inami [email protected]
escrevi:
Estou um pouco confuso…
Por que apenas no ambiente de teste ele é postado em hash? Isso é esperado
comportamento do Rails?—
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/rspec/rspec-rails/issues/1755#issuecomment-262872045 ,
ou silenciar o thread
https://github.com/notifications/unsubscribe-auth/AAJ8oGL2BlWnFdwoFiun5ifa8AvQ2-DUks5rBk_fgaJpZM4K7muV
.
Obrigado acho que agora entendi,
Então você quer dizer que nos meus casos de teste o hash é sempre enviado.
E somente abaixo de development
ele é convertido em hash, mas isso não acontece no ambiente test
. Por isso recebo o erro.
Comentários muito úteis
Obrigado acho que agora entendi,
Então você quer dizer que nos meus casos de teste o hash é sempre enviado.
E somente abaixo de
development
ele é convertido em hash, mas isso não acontece no ambientetest
. Por isso recebo o erro.