我有一个非常简单的rails控制器测试,其运行方式取决于它的运行方式:
当我使用以下方式运行时:
RAILS_ENV=test ruby -Itest test/controllers/news_controller_test.rb
测试通过正常(我使用RAILS_ENV
尝试使其尽可能与rake test
类似。
使用rake test
运行时,测试失败并显示:
12)错误:NewsController :: admin#test_0003_创建一个新的新闻帖子: ActionView :: MissingTemplate:缺少模板新闻/创建, application / create with {:locale => [:en],:formats => [:html], :variants => [],:handlers => [:erb,:builder,:raw,:ruby,:slim, :jbuilder,:coffee]}。搜索范围:* “/ home / emery / eop / portal / app / views”* “/home/emery/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/kaminari-0.15.1/app/views”
test/controllers/news_controller_test.rb:73:in `block (4 levels) in <top (required)>' test/controllers/news_controller_test.rb:72:in `block (3 levels) in <top (required)>'
这只是一个特定情况,其中测试在rake test
下失败但是传递了ruby -Itest
...还有许多其他行为都是这样的。像这样的一些人缺少他们不应该需要的模板,其他人在重定向用户时会返回成功,而其他人则更加深奥。这就是为什么我的问题更为一般,rake test
和RAILS_ENV ruby -Itest ...
之间的主要区别是什么?我希望能够自己调试这些。
我的堆栈是Rails 4.1rc1,使用minitest-spec-rails(主分支)。
为了完整性,以下是上述错误的测试和控制器代码:
控制器动作非常简单:
def create
@news = News.new(safe_params)
if @news.save
redirect_to news_index_path
else
render :new
end
end
代码重定向或呈现新模板,因此新闻/创建不存在,但不应该需要。
控制器测试代码为:
let(:editor) { User.create! first_name: 'Malcom', last_name: 'Reynolds', email: 'captain@firefly.com', password: 'hmm' }
before do
subject.login editor
end
...
it 'creates a new news post' do
assert_difference 'News.count', 1 do
post :create, news: { subject: 'abcd', body: 'rst' }
end
assert_redirected_to news_index_path
end
(subject.login
是应用程序控制器上的自定义登录功能)
答案 0 :(得分:0)
原来我的其他一个控制器测试用例存在问题。我有一个控制器测试模拟了几个调用,但那些模拟是无意中永久性的,改变了应用程序控制器。这以不同的方式打破了剩余的控制器测试用例。
因此,在这种情况下的关键区别是运行rake测试运行所有测试用例,而ruby -Itest只运行一次测试。