簡體   English   中英

小型測試控制器測試失敗

[英]minitest controller testing failure

我在用minitest測試控制器時遇到了麻煩。 在以下情況下,我的問題-嘗試刪除記錄時。 控制器只是命名空間admin基本支架,但測試如下:

require 'test_helper'

describe Admin::ProvidersController do

  let(:provider) { FactoryGirl.create(:provider) }

  it "gets index" do
    get :index
    assert_response :success
    assert_not_nil assigns(:providers)
  end

  it "gets new" do
    get :new
    assert_response :success
  end

  it "creates provider" do
    assert_difference('Provider.count') do
      post :create, provider: { description: 'Description', name: 'Name' }
    end

    assert_redirected_to admin_provider_path(assigns(:provider))
  end

  it "shows provider" do
    get :show, id: provider
    assert_response :success
  end

  it "gets edit" do
    get :edit, id: provider
    assert_response :success
  end

  it "updates provider" do
    put :update, id: provider, provider: { description: 'New description', name: 'New name' }
    assert_redirected_to admin_provider_path(assigns(:provider))
  end

  it "destroys provider" do
    assert_difference('Provider.count', -1, 'An Provider should be destroyed') do
      delete :destroy, id: provider
    end

    assert_redirected_to admin_providers_path
  end

end

rake test:controllers我看到:

Started

Admin::ProvidersController
  test_0001_gets index                                            PASS (0.12s)
  test_0002_gets new                                              PASS (0.17s)
  test_0003_creates provider                                      PASS (0.01s)
  test_0004_shows provider                                        PASS (0.04s)
  test_0005_gets edit                                             PASS (0.05s)
  test_0006_updates provider                                      PASS (0.01s)
0
0
  test_0007_destroys provider                                     FAIL (0.02s)
Minitest::Assertion:         An Provider should be destroyed.
        "Provider.count" didn't change by -1.
        Expected: -1
          Actual: 0
        /Users/alec/.rvm/gems/ruby-2.1.1@lorgnette/gems/activesupport-4.1.1/lib/active_support/testing/assertions.rb:76:in `block in assert_difference'
        /Users/alec/.rvm/gems/ruby-2.1.1@lorgnette/gems/activesupport-4.1.1/lib/active_support/testing/assertions.rb:73:in `each'
        /Users/alec/.rvm/gems/ruby-2.1.1@lorgnette/gems/activesupport-4.1.1/lib/active_support/testing/assertions.rb:73:in `each_with_index'
        /Users/alec/.rvm/gems/ruby-2.1.1@lorgnette/gems/activesupport-4.1.1/lib/active_support/testing/assertions.rb:73:in `assert_difference'
        /Users/alec/Documents/Projects/RubyApps/lorgnette/test/controllers/admin/providers_controller_test.rb:42:in `block (2 levels) in <top (required)>'


Fabulous run in 0.43316s
7 tests, 11 assertions, 1 failures, 0 errors, 0 skips

在日志中,我看到:

-------------------------------------------------------
Admin::ProvidersController: test_0007_destroys provider
-------------------------------------------------------
   (0.4ms)  SELECT COUNT(*) FROM "providers"
   (0.3ms)  SELECT COUNT(*) FROM "providers"
   (0.2ms)  SAVEPOINT active_record_1
  SQL (0.4ms)  INSERT INTO "providers" ("created_at", "description", "name", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["created_at", "2014-05-30 23:06:43.102303"], ["description", "MyText"], ["name", "MyString"], ["updated_at", "2014-05-30 23:06:43.102303"]]
   (0.2ms)  RELEASE SAVEPOINT active_record_1
Processing by Admin::ProvidersController#destroy as HTML
  Parameters: {"id"=>"271"}
  Provider Load (0.4ms)  SELECT  "providers".* FROM "providers"  WHERE "providers"."id" = $1 LIMIT 1  [["id", 271]]
   (0.2ms)  SAVEPOINT active_record_1
  SQL (0.3ms)  DELETE FROM "providers" WHERE "providers"."id" = $1  [["id", 271]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
Redirected to http://test.host/admin/providers
Completed 302 Found in 3ms (ActiveRecord: 0.9ms)
   (0.3ms)  SELECT COUNT(*) FROM "providers"
   (0.2ms)  SELECT COUNT(*) FROM "providers"
   (0.5ms)  ROLLBACK

刪除測試有什么問題?

是的,因為在您assert_difference提供程序計數為零時,引用“ id:provider”時,提供程序計數會增加,然后銷毀會減少提供程序計數。 因此,它從零開始,到零結束。

試試這個...

  it "destroys provider" do
    provider
    assert_difference('Provider.count', -1, 'An Provider should be destroyed') do
      delete :destroy, id: provider
    end
  end

這樣,可以在assert_difference塊之前實例化提供程序。

正如Steve所說,在您調用delete調用之前,尚未創建provider 您可以使用let!輕松避免這種情況let! 而不是let

let!(:provider) { FactoryGirl.create(:provider) }

使用let! 在測試開始之前將調用FactoryGirl.create

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM