记录了 Minitest 实例变量但断言为零
Minitest instance variables logged but assertion gets nil
小测试returnsExpected 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
和测试日志returns:
#<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. Its use is not recommended outside of legacy code. Instead the modern approach is to write integration tests that test the response and effects of your controller without poking into its internals。
小测试returnsExpected 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
和测试日志returns:
#<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. Its use is not recommended outside of legacy code. Instead the modern approach is to write integration tests that test the response and effects of your controller without poking into its internals。