导轨版本:4.1.10
Rspec-rails 版本:3.0.2
我正在编写一个请求测试,一个模型需要一个属性是布尔值true
,而不是字符串true
。
从请求测试 ( param[:attribute] = true
) 传入此参数时,模型会收到: model.attribute = "true"
。 ( "true"
作为字符串)
当从控制器测试( param[:attribute] = true
)传递参数时,模型会收到: model.attribute = true
。 ( true
为布尔值)
如何将true
作为布尔值从请求测试传递给模型?
你试过model.attribute =(1 == 1)吗?
问题不是分配model.attribute
,而是从控制器传入的 rspec 参数( params[:attribute] = true
导致: model.attribute == true
)和请求( params[:attribute] = true
)之间的差异model.attribute == 'true'
)。
给定相同的参数,控制器测试将布尔值 true 传递给模型,而请求测试将字符串 true 传递给模型。
如果事情不清楚,请告诉我,我可以创建一个简单的 rails 项目来演示。
这是rails测试如何表现的一个问题,实际上params将始终是字符串,除非先前由中间件解码,例如在JSON的情况下,这可能是控制器测试允许您传递真实对象的原因......
啊,好的。 感谢您的澄清。
有没有办法让请求测试使用与控制器测试相同的中间件?
他们已经会了。
如果布尔参数作为真/假而不是字符串到达控制器,则很有可能您将它们作为正文中的 JSON 传递。 在这种情况下,您必须这样做:
post :update, params: { id: user.id, attribute: true }, as: :json
或这个:
post :update, params: { id: user.id }, body: { attribute: true }.to_json, as: :json
在测试中也将它们作为布尔值传递。
最有用的评论
如果布尔参数作为真/假而不是字符串到达控制器,则很有可能您将它们作为正文中的 JSON 传递。 在这种情况下,您必须这样做:
或这个:
在测试中也将它们作为布尔值传递。