2010-06-25 8 views
16

Tôi đã làm theo các hướng dẫn 15 TDD steps to create a Rails application - nhưng đã chạy vào một vấn đề tôi dường như không thể giải quyết. Đối với các thử nghiệm chức năng của WordsController, tôi có đoạn mã sau:Mocha Mock Carries Để thử nghiệm khác

class WordsControllerTest < ActionController::TestCase 

    test "should get learn" do 
    get 'learn' 
    assert_response :success 
    end 

    test "learn passes a random word" do  
    some_word = Word.new 
    Word.expects(:random).returns(some_word) 
    get 'learn' 
    assert_equal some_word, assigns('word') 
    end 
end 

Trong lớp Lời Tôi có đoạn mã sau:

class Word < ActiveRecord::Base 
    def self.random 
    all = Word.find :all 
    all[rand(all.size)] 
    end 
end 

Khi tôi chạy thử nghiệm, tôi kinh nghiệm các lỗi sau (rút ngắn cho ngắn gọn):

1) Failure: unexpected invocation: Word(...).random() satisfied expectations: 
- expected exactly once, already invoked once: Word(...).random() 

Tôi đã thử thay đổi thứ tự các bài kiểm tra cùng với vô số thứ khác, nhưng thời gian và lần nữa tôi tiếp tục nhận được cùng một câu hỏi t thất bại - rằng Word.random() đã được gọi.

Tôi đang chạy Rails 3.0 beta 4 và Mocha 0.9.8. Tôi đã tìm kiếm lâu dài và khó khăn cho một giải pháp cho vấn đề của tôi, nhưng tôi dường như không thể tìm thấy nó. Tôi là người mới đối với Ruby/Rails nên khá lạ lẫm với ngôn ngữ và khung công tác.

Cảm ơn trước!

Trả lời

7

Tôi đã gặp vấn đề tương tự, chức năng giả mạo không bị cô lập để kiểm tra, có vẻ như đó là vấn đề với thứ tự tải của Mocha.

Tôi gặp một số sự cố khi Mocha hoạt động với Rails3. Tôi tìm thấy một vài bài viết về stackoverflow, nhưng không vấp ngã trên giải pháp cho đến khi tôi tìm thấy một bài đăng trên agoragames.com

Về cơ bản, trong Gemfile của dự án của bạn, yêu cầu cho Mocha nên hình như:

gem 'mocha', :require => false 

Sau đó, trong test/test_helper.rb, thêm một dòng yêu cầu cho mocha:

... 
... 
require File.expand_path('../../config/environment', __FILE__) 
require 'rails/test_help' 
require 'mocha' 

class ActiveSupport::TestCase 
... 
... 

tôi nghĩ rằng yêu cầu dòng cho mocha trong Gemfile có nghĩa là bạn cần phải đã có mocha cài đặt như một viên ngọc, bundler sẽ không chăm sóc của nó cho bạn.

2

Bạn yêu cầu mocha như thế nào? Bạn đang sử dụng bundler? Nghe có vẻ hơi giống móc treo mocha không được gọi?

+0

Dịch vụ teardown có được gọi giữa các lần kiểm tra không? – pushmatrix

+1

Nếu 'Mocha' đã được tải chính xác, nó sẽ có khuôn khổ thử nghiệm được vá bằng khỉ để gọi 'Mocha :: API # mocha_verify' &' Mocha :: API # mocha_teardown' tức là bạn không cần phải gọi chúng một cách rõ ràng. Lý do tôi hỏi làm thế nào 'Mocha' đã được yêu cầu, là để làm việc ra cho dù mọi thứ đang được nạp theo thứ tự đúng, để các bản vá lỗi khỉ hoạt động chính xác. –

+1

Nếu bạn đặt 'MOCHA_OPTIONS = debug' làm biến môi trường khi chạy thử nghiệm, bạn sẽ thấy khung kiểm thử nào đang được vá thành công. Nếu bạn vẫn gặp sự cố với điều này, hãy cho tôi biết đầu ra gỡ lỗi là gì và cho tôi biết phiên bản nào của Mocha bạn đang sử dụng. Cảm ơn. –

19

mocha cần được tải trước. Tôi cũng phải vật lộn với vấn đề này.

#Gemfile 
    group :test 
    gem 'mocha', '~>0.9.8', :require => false 
    ... 
    end 

test_helper.rb 
    .... 
    #at the very bottom 
    require 'mocha' 
+1

Chính xác những gì tôi cần ... – pushmatrix

+0

Chính xác những gì tôi cần. Tôi đã rách tóc ra với điều này hàng giờ! Cảm ơn! :) –

+0

+1, với việc di chuyển sang gói hàng rối tung của tải mocha –

0

Bên cạnh đó, có vẻ như mocha_teardown không được gọi với rails31. Mocks được thiết lập không bao giờ bị xóa ... (lỗi bổ sung này sửa lỗi)

class ActiveSupport::TestCase 
    def teardown 
     super 
     Mocha::Mockery.instance.teardown 
     Mocha::Mockery.reset_instance  
    end 
    end 
0

Các giải pháp này không hoạt động cho riêng tôi, sử dụng Ruby 2.2.2, Rails 4.2.2, mocha 1.1. 0, ifa-context 1.2.1, factory_girl_rails 4.5.0 và một vài thử nghiệm liên quan đến đá quý.

gì đã làm nó đã cũng di chuyển hai dòng sau ở dưới cùng của test_helper.rb tôi:

require 'mocha/setup' 
require 'mocha/test_unit' 

tôi cũng loại bỏ require 'test/unit'. Có vẻ như mocha/test_unit đã làm điều đó đối với tôi.