如何解决Minitest 实例变量已记录但断言为零
最小测试返回 Expected nil to be truthy.
控制器动作处理以下语句
@cu = current_user.roleshopusers.where(shop_id: @site.shop_id).first
@cu_role = @cu.try(:role_id)
@cu_buyer = @cu.buyer
Rails.logger.info @cu.inspect
Rails.logger.info @cu.buyer
测试日志返回:
#<Roleshopuser id: 434940726,user_id: 7,shop_id: 31,role_id: 1,buyer: true,special_support: false,special_needs: nil,notes: nil,discount: 0.0,created_at: "2021-06-16 13:56:37.288691000 +0200",updated_at: "2021-06-16 13:56:37.288691000 +0200">
true
但是测试,同时使用相同的方法定义返回正确的值,
puts current_user.id
puts current_user.roleshopusers.where(shop_id: @site.shop_id).first.buyer
puts @cu.inspect
assert @cu_buyer
没有可用的实例变量。
7
true
nil
那么这个测试应该如何表述?
解决方法
实例变量不是全局变量。它们是作用域为定义 的实例的词法变量。如果您开始使用 Rails 而没有先学习 Ruby,这是一个常见的初学者挂断,因为它“神奇地”使您的控制器实例变量可用于视图。
您认为您在控制器中定义的实例变量应该在测试中设置的期望是完全错误的,因为它们是不同类的完全独立的实例。
在传统控制器测试中,assigns
方法通常用于探查控制器内部并编写有关其实例变量的断言:
assert(assigns(:cu_buyer))
这已被弃用并完全从 Rails 中删除,但仍然 exists as an gem。不建议在遗留代码之外使用它。相反,现代方法是编写test the response and effects of your controller without poking into its internals 的集成测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。