2010-10-04 14 views
32

Làm cách nào để tắt đồ thị giao dịch cho chỉ một thông số kỹ thuật (hoặc kịch bản Bít tết) bằng RSpec 2? Tôi đã thử một số nội dung được tìm thấy trên web mà không thành công.Tắt đồ đạc giao dịch cho một thông số với RSpec 2

Điều này dẫn đến một ngoại lệ phương pháp không xác định.

 
describe "MyClass without transactional fixtures" do 
    self.use_transactional_fixtures = false 
    ... 
end 

này chỉ đơn giản là không làm gì (vật cố giao dịch vẫn còn nằm trên):

 
describe "MyClass without transactional fixtures" do 
    RSpec.configure do |config| 
    config.use_transactional_fixtures = false 
    end 
    ... 
end 

tôi có thể thử điều gì nữa?

+0

nó thực sự có dây để muốn điều đó. bởi vì bạn không thể biết những gì bạn có trong cơ sở dữ liệu của mình. – shingara

+0

Tôi hy vọng điều đó cũng không đúng đối với mã của bạn ;-) Nhưng nghiêm túc, đối với một số trường hợp thử nghiệm, bạn phải vô hiệu hóa các đồ thị giao dịch. Ví dụ, như trong trường hợp của tôi, để kiểm tra Tư duy Nhân sư. Nhân sư cần cập nhật chỉ mục tìm kiếm từ "bên ngoài". Và do đó, nó phải biết nội dung cơ sở dữ liệu tại một thời điểm cụ thể. – Zardoz

+0

Chỉ một điều cần lưu ý; Ít nhất trong môi trường của tôi (Rails4 rspec 2) nếu bạn vì lý do nào đó bao gồm rspec/rails_helper trong bất kỳ tệp rspec nào của bạn, nó sẽ gây ra bất kỳ kiểm tra nào sau khi nó trong bộ hoặc trong các tệp tiếp theo được chạy lại một lần nữa. –

Trả lời

7

Đây từng là lỗi (xem ticket #197), nhưng có vẻ như tôi không sao. Tôi chỉ không biết nếu nó sẽ làm việc trên một cơ sở thử nghiệm (có lẽ là không). Nếu bạn muốn làm điều này, bạn có thể vô hiệu hóa các đồ đạc giao dịch trên toàn cầu bằng cách đặt config.use_transactional_fixtures = false trên spec_helper.rb và sử dụng DatabaseCleaner để thiết lập điều đó.

Tôi đã gặp sự cố tương tự khi thử nghiệm các trang có javascript trên trình duyệt (một tình huống không hoạt động với các đồ thị giao dịch). Đây là cách tôi quản lý để làm việc xung quanh nó: http://github.com/lailsonbm/contact_manager_app

+1

Cảm ơn bạn đã chỉ cho tôi vé, Lailson. Trả lời chấp nhận :-) Tôi cũng sử dụng một giải pháp thay thế vì tôi không muốn vô hiệu hóa các đồ đạc giao dịch trên toàn cầu (quá chậm). Tôi chỉ đơn giản là làm một MyClass.connection.commit_db_transaction() sau khi các đối tượng được tạo ra. Sau đó, tôi làm bài kiểm tra và sau đó xóa các mục cơ sở dữ liệu. Điều đó hoạt động tốt và tất cả các thử nghiệm khác vẫn sử dụng tính năng giao dịch. – Zardoz

+0

Tuyệt. Như tôi đã nói, bạn có thể làm điều này một cách rõ ràng với DatabaseCleaner (xem github repo README tôi đã chỉ rõ cách thực hiện điều này).Nhưng giải pháp của bạn là khả thi quá, chỉ là một chút dễ bị lỗi. Nhưng nếu nó làm việc và bạn hài lòng, mát mẻ ... =) –

+0

Tôi đã thử 'MyClass.connection.commit_db_transaction' nhưng nó để lại kết nối trong một trạng thái lẻ, nơi nó nghĩ rằng nó có một giao dịch mở nhưng nó không. Điều này làm cho một số lệnh ghi hoạt động nhất định không hoạt động và cũng dẫn đến cảnh báo. Điều này dường như khắc phục được sự cố đó, thực sự đóng giao dịch trong db và cập nhật kết nối để biết nó không còn giao dịch mở: MyClass.connection..transaction_manager.commit_transaction – nbrustein

25

tôi thường thêm một helper như thế này:

def without_transactional_fixtures(&block) 
    self.use_transactional_fixtures = false 

    before(:all) do 
    DatabaseCleaner.strategy = :truncation 
    end 

    yield 

    after(:all) do 
    DatabaseCleaner.strategy = :transaction 
    end 
end 

nào cho phép tôi tắt đồ đạc giao dịch cho một khối cụ thể trong thông số kỹ thuật:

describe "doing my thing" do 
    without_transactional_fixtures do 
    it "does something without transaction fixtures" do 
     ... 
    end 
    end 
end 
+0

bạn có chắc chắn nó hoạt động không? Tôi đã thử ở đây để kiểm tra một cái gì đó đã được sử dụng giao dịch đường ray và không làm việc: ( – Guilherme

+2

Bạn chỉ có thể thay đổi DatabaseCleaner.strategy trong một khối trước/sau của thông số kỹ thuật của bạn quá. –

7

Tôi đã làm theo cách này, với database_cleaner, để kiểm tra mã sử dụng giao dịch (sẽ xung đột với transactional_fixtures hoặc bất kỳ chiến lược nào khác để thực hiện các kiểm tra giao dịch ví dụ: DatabaseCleaner.strategy =: truncation hoặc: transaction):

# spec_helper.rb 
config.use_transactional_fixtures = false 
config.around(:each, :testing_transactions => true) do |ex| 
    DatabaseCleaner.strategy = nil 
    ex.run 
    DatabaseCleaner.strategy = :truncation 
end 

và trong các trường hợp thử nghiệm của tôi:

it "should not save if one of objects are invalid", :testing_transactions => true 
0

Không chắc chắn nếu áp dụng cho RSpec2, nhưng hoạt động tốt với 3.

config.use_transactional_fixtures = true 
config.around(:each, use_transactional_fixtures: false) do |example| 
    self.use_transactional_tests = false 
    example.run 
    self.use_transactional_tests = true 
end 

tâm (Tùy chọn rspec-ray) use_transactional_fixturesuse_transactional_tests (tùy chọn đồ đạc activerecord) khác biệt.