2015-06-22 24 views
2

"User.count" didn't change by 1什麼意思和如何解決?以下是控制檯的命令行。「User.count」沒有改變1 - Rails

下面是我從bundle exec rake test得到了失敗,我正在尋找一種方式來解決這些問題:

$ bundle exec rake test 
Run options: --seed 210 

# Running: 

.....F...F.. 

Finished in 1.084264s, 11.0674 runs/s, 13.8343 assertions/s. 

    1) Failure: 
UsersControllerTest#test_should_create_user [app/test/control 
lers/users_controller_test.rb:20]: 
"User.count" didn't change by 1. 
Expected: 3 
    Actual: 2 


    2) Failure: 
UsersControllerTest#test_should_update_user [app/test/control 
lers/users_controller_test.rb:39]: 
Expected response to be a <redirect>, but was <200> 

12 runs, 15 assertions, 2 failures, 0 errors, 0 skips 

和加法,這是什麼意思"Expected response to be a <redirect>, but was <200>"

而下面的代碼是我在這個測試已經運行:

下面是一行39 users_controller_test.rb

37 test "should update user" do 
    38  patch :update, id: @user, user: { first_name: @user.first_name, last_name: @user.last_name, email: @user.email, } 
    39  assert_redirected_to user_path(assigns(:user)) 
    40 end 

這裏是在控制器代碼。 爲1),下面是一行20 users_controller_test.rb

19 test "should create user" do 
    20  assert_difference('User.count') do 
    21  post :create, user: { first_name: @user.first_name, last_name: @user.last_name, email: @user.email, } 
    22  end 

下面是我的users_controller#update看起來像

def update 
    respond_to do |format| 
    if @user.update(user_params) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { render :show, status: :ok, location: @user } 
    else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

前置條件:

我添加電子郵件以後很有價值我創建了我的初始用戶模型,遵循Jonathan MacDonald的YouTube教程「如何在Windows 7上安裝Ruby on Rails - 第4部分,Ruby o ñRails的」 過程開始於11:00

$ rails generate scaffold user first_name:string last_name:string 
$ rake db:migrate 

然後在控制檯的沙箱有點玩弄後,我在我的用戶模型按如下步驟在6.3.1添加電子郵件值的哈希密碼從railstutorial組織的電子書:

原始命令:

$ rails generate migration add_password_digest_to_users password_digest:string 
My command to add email value in my user model: 
$ rails generate migration add_email_to_users email:string 
$ rake db:migarate 

,然後我已經更新下列文件:

控制器

1)'MyApp的'/應用/控制器/ users_controller.rb [添加:電子郵件在許可證()]

def user_params 
    params.require(:user).permit(:first_name, :last_name, :email) 
end 

2)「的myapp/test/controllers/users_controller_test.rb' [在'test'中添加電子郵件地址:@ user.email應該創建用戶「do」和「test」應該更新用戶「do」]

test "should create user" do 
    assert_difference('User.count') do 
    post :create, user: { first_name: @user.first_name, last_name: @user.last_name, email: @user.email, } 
end 
# ... 
test "should update user" do 
    patch :update, id: @user, user: { first_name: @user.first_name, last_name: @user.last_name, email: @user.email, } 
    assert_redirected_to user_path(assigns(:user)) 
end 

模型

1)'MyApp的'/應用/模型/用戶。RB [添加validaates電子郵件通過添加此行]

validates :email, presence: true, length: { maximum: 255 } 

2)'MyApp的'/測試/ modles/user_test.rb

def setup 
    @user = User.new(first_name: "Example", last_name:"User", email: "[email protected]") 
end 

[add email validation tasks] 

    test "email should be present" do 
     @user.email = "  " 
     assert_not @user.valid? 
    end 
    test "email should not be too long" do 
     @user.email = "a" * 244 + "@example.com" 
     assert_not @user.valid? 
    end 
[在用戶設置的定義添加電子郵件值]

瀏覽

1)「MYAP P'/應用/視圖/用戶/ _form.html.erb [電子郵件添加字段]

<div class="field"> 
    <%= f.label :email %><br> 
    <%= f.text_field :email %> 
</div> 

2)'MyApp的'/應用/視圖/用戶/ index.html.erb [添加在表電子郵件coulmn]

<td> 
    <%= user.email %> 
</td> 

3)'MyApp的'/應用/視圖/用戶/ show.html.erb [添加電子郵件節段]

<p> 
    <strong>email:</strong> 
    <%= @user.email %> 
</p> 

然後當我運行bundle exec rake test時,我一直面對着我提出的這些錯誤。

有一個文件叫做users.yml,我認爲這在開始時並不相關。但實際上這是由於這些失敗造成的。所以我在我的答案中引用這個文件中的代碼。爲了簡單起見,我在這裏並沒有在我的問題部分提及它。

+0

您沒有向我們展示導致這些故障的控制器代碼。可以這麼說,測試中提出的假設並沒有被實際的控制器帶來實現,但很難在沒有看到控制器本身的情況下推斷出爲什麼。 – Makoto

+0

檢查日誌/測試。日誌文件 – Axxiss

+0

您能否給我們提供用戶測試的所有相關代碼 - 這包括設置'@ user'變量的代碼(在您的測試中,而不是控制器)?同時向我們展示您的用戶模型(因此我們知道有哪些驗證)。最有可能的問題是,您由於某種原因未能通過驗證,所以用戶沒有被創建......但是對於我們來說,我們需要確認我們需要知道您使用的是什麼信息以及預期的驗證。 –

回答

7

這些故障已通過電子郵件屬性在「的myapp /測試/夾具/ users.yml裏」缺失而引起的email屬性是在生產中添加後來的環境。我使用'first_name''last_name'創建了初始用戶模型,沒有'email',正如我在我的問題的步驟中所述。

在初始創建後,有許多命令可以幫助在新增屬性的相關文件中添加屬性。但是我已經在相關文件中手動添加了屬性,如下面的代碼所示。

'MYAPP /測試/夾具/ users.yml裏'

原文:

one: 
    first_name: MyString 
    last_name: MyString 
two: 
    first_name: MyString 
    last_name: MyString 

更新:

one: 
    first_name: MyString 
    last_name: MyString 
    email: MyString 
two: 
    first_name: MyString 
    last_name: MyString 
    email: MyString 

然後運行

$ bundle exec rake test 
    Run options: --seed 1540 

    # Running: 

    ............... 

    Finished in 2.383035s, 6.2945 runs/s, 8.8123 assertions/s. 

    15 runs, 21 assertions, 0 failures, 0 errors, 0 skips 


不過,我在下面的列表總結下來的 '1' 和 '200' 的含義。

[什麼劑量「1」的意思]
要了解這個數字'1'意味着,你需要閱讀接下來的幾行

Expected: 3 
    Actual: 2 

它說,預計3,但實際上2.只有2屬性'first_name''last_name''myapp/test/fixtures/users.yml'乞討時,它假設有3個屬性是'first_name''last_name''email'然後我猜這是關於由拉起數'1'缺少「MyApp的/測試/裝置/ users.yml裏」屬性的數消息中提到..

[答案爲「200」]
我認爲這號碼有也具有獨特的含義,相關的源代碼,而不是HTTP狀態代碼。它實際上只是HTTP狀態碼。代碼'200'意味着正常,你可以在下面的鏈接中看到。

10.2.1 200 OK

請求成功。與響應 返回的信息依賴於請求所使用的方法...

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

它說預期的響應是重定向,而不是僅僅去徹底。

2

這可能意味着控制器正在返回錯誤。您可能會通過傾銷assigns(:user).errors的內容來看到錯誤。 Pry或其他REPL會有所幫助。否則,puts assigns(:user).errors.inspect應該工作。

+0

以上是一個奇妙的命令(放一個)。什麼樣的類會分配具有「錯誤」方法的返回?另外你如何弄清Rails中的類和方法? – Richard

+2

'assignigns(:user)'只是在控制器中返回一個類變量('@ user')。在這種特殊情況下,'@ user'被分配爲一個ActiveRecord對象的實例。 ActiveRecord引入一個ActiveModel :: Errors的實例,並通過'#errors'方法使其可用。 –

+0

@will_in_wi我可以從PRY內部進行檢查嗎?我試圖弄清楚我是做錯了還是隻是追錯樹 – Mirv

-1
  1. 用戶應該已經創建,但事實並非如此。很多可能的原因,即重複的電子郵件。
  2. 您的測試需要在編輯用戶之後進行重定向,但rails只呈現某個頁面。你有redirect_to @userusers_controller#update
5

未能增加User.count和渲染< 200>是出於同樣的原因......您無法創建記錄,因爲您驗證失敗。

在這個測試中...

19 test "should create user" do 
    20  assert_difference('User.count') do 
    21  post :create, user: { first_name: @user.first_name, last_name: @user.last_name, email: @user.email, } 
    22  end 

你引用@user但除非你在測試有一個設置有沒有定義@user對象。

嘗試指定值...

19 test "should create user" do 
    20  assert_difference('User.count') do 
    21  post :create, user: { first_name: 'John', last_name: 'Smith', email: '[email protected]' } 
    22  end 
+0

您好SteveTurczyn, 感謝您的想法。現在測試工作正常W/O驗證失敗。但對於說明,當我指定具有實際值的值時,也適用於指定這些字符串。 乾杯! – masaaki