运行rake测试和运行ruby -Itest test / ...之间的主要区别是什么(Rails 4.1)

时间:2014-03-17 15:00:46

标签: ruby-on-rails unit-testing ruby-on-rails-4 minitest

我有一个非常简单的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 testRAILS_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是应用程序控制器上的自定义登录功能)

1 个答案:

答案 0 :(得分:0)

原来我的其他一个控制器测试用例存在问题。我有一个控制器测试模拟了几个调用,但那些模拟是无意中永久性的,改变了应用程序控制器。这以不同的方式打破了剩余的控制器测试用例。

因此,在这种情况下的关键区别是运行rake测试运行所有测试用例,而ruby -Itest只运行一次测试。