这种反应可能是老了多大用处的给你,但有两件事情站出来给我。
1)这不应该是一个集成测试,因为你没有测试多个控制器之间的交互。这应该是一个功能测试,用于测试单个控制器,在这种情况下是您的UsersController。这是非常重要的,因为不同的方法和功能根据你的声明是可用/加载的。
class UserStoriesTest < ActionDispatch::IntegrationTest
会给你一个非常不同的环境
class UserTest < ActiveSupport::TestCase
注意,集成测试是ActionDispatch的部分,而功能测试的ActiveSupport的一部分。我强烈建议将其移至功能测试,这可能是您错误的根源。
2)使用delete_all有点极端。实际上,当你发布帖子时,你可以做一个断言测试,看看是否存在计数差异。
assert_difference('User.count') do
post :create, :user => {name: 'david',
email: '[email protected]',
password: 'qwe123',
password_confirmation: 'qwe123'}
end
这将断言User.count不同于运行do循环中和do循环结束之前的内容。那里的那个街区可以取代你在“注册”测试中的一切。有趣的是,您可以将assert_difference更改为assert_no_difference,如果通过,您知道您的users_controller.rb中的post方法有问题(这是我认为您的问题实际存在的地方)。
3)您的assert_equal行看起来有点奇怪。通过的最后一个参数是它在失败时会吐出的消息。只打印一个数字可能适用于一项测试,但在许多测试中看起来会很奇怪。这样的东西,因为我相信下面是接近规范:
assert_equal 1, User.count, "Expected User.count to be equal to 1, instead it is equal to: " + User.count.to_s
另外请注意,你可以使用的,而不是做一些像把所有的记录成一个对象,然后调用该对象的大小ModelName.count 。这很快就会变得非常混乱。
最后,作为一个通用的调试工具,您可以在整个地方抛出puts语句或logger语句来查看实际正在进行的操作。
puts User.count
在你的delete_all和你的post_via_redirect会很快告诉你哪里出了问题。如果您使用记录器方法,它将被写入到您的appname/log/ENV.log中的日志中。所以如果你正在运行测试,它将在test.log中。
logger.debug User.count
你的日志也将保持所有的请求的记录,这样你就可以阅读,看看你得到200个OKS,302个重定向等
我建议您查看所提供的以下指南导轨,他们是伟大的起点地方:
http://guides.rubyonrails.org/testing.html
http://guides.rubyonrails.org/debugging_rails_applications.html
希望这^ h帮助别人!