【发布时间】:2023-03-30 09:15:01
【问题描述】:
我有一个非常简单的 rails 控制器测试,它的行为取决于它的运行方式:
当我使用以下方式运行它时:
RAILS_ENV=test ruby -Itest test/controllers/news_controller_test.rb 测试通过了(我使用RAILS_ENV 尝试使其与rake test 尽可能相似。
使用rake test 运行时,测试失败并显示:
12) 错误:NewsController::admin#test_0003_creates new news post: ActionView::MissingTemplate:缺少模板新闻/创建, 应用程序/使用 {: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
代码重定向或呈现新模板,因此 news/create 确实不存在,但它不应该是必需的。
控制器测试代码为:
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是应用控制器上的自定义登录功能)
【问题讨论】:
-
我遇到了同样的问题并绞尽脑汁。你有什么发现吗?
-
很遗憾,我什么也没想到。我基本上必须接受我的一些测试失败,并了解哪些测试。我有两个测试未决。首先是更新到 Rails 4.1,因为我在 4.1.rc2 上运行。二是切换到rspec。如果我发现任何东西,我会更新这个。
标签: ruby-on-rails unit-testing ruby-on-rails-4 minitest