2012-02-29 28 views
5

Các kịch bản sau đây khá nhiều tổng kết vấn đề của tôi:kiểm tra một ứng dụng dòng lệnh với dưa chuột/Aruba/Timecop: Làm thế nào để tiêm bối cảnh

Scenario: problems with subprocesses 
    Given the date is 01/01/2012 10:31 
    When I run `ruby -e "puts Time.now"` 
    Then the output should contain "10:31" 

Nó nắm để When I run ruby -e "puts Time.now" tung ra một quá trình con và do đó làm cho tất cả các của tôi Timecop.freeze stubs không hiệu quả, vì họ chỉ làm việc trên quá trình chính. Tôi cần phải bằng cách nào đó 'tiêm' ngữ cảnh hiện tại vào lệnh đang chạy, nhưng tôi dường như không thể nghĩ ra bất cứ điều gì. Tôi đang cố gắng điều gì đó không thể ở đây?


Bước:

require 'timecop' 
Given /^the date is (\d+)\/(\d+)\/(\d+) (\d+):(\d+)$/ do |month, day, year, hour, minute| 
    Timecop.freeze(Time.local(year.to_i, month.to_i, day.to_i, hour.to_i , minute.to_i, 0)) 
end 

Trả lời

1

tôi thấy 2 lựa chọn ở đây.

  1. Tạo một cái móc trong hệ thống được thử nghiệm mà bạn có thể sử dụng để tiêm bối cảnh yêu cầu, trong ví dụ này, bạn có thể thêm một tham số 'thời điểm hiện tại' để ứng dụng dòng lệnh mà bạn đang thử nghiệm. Hoặc chỉ định thời gian cố định trong tệp cấu hình ứng dụng hoặc cơ sở dữ liệu, có nhiều tùy chọn. Điều này giả định rằng bạn sở hữu ứng dụng mà bạn đang thử nghiệm và có thể thực hiện các thay đổi đó. Điều này chỉ cần một thay đổi rất nhỏ, ví dụ: nếu tham số 'thời gian hiện tại' được chỉ định, thì hãy sử dụng Timecop để cố định thời gian tại thời điểm đó.

  2. Tìm cách nào đó để đưa hệ thống được thử nghiệm vào quy trình Dưa chuột. Trong ví dụ của bạn thay vì bắn phá ra ruby -e "puts Time.now", bạn có thể instance_eval "puts Time.now". Thực tế hơn, bạn có thể require ứng dụng và nếu người chạy dòng lệnh chỉ đơn giản là một trình bao bọc mỏng xung quanh một số lớp thực sự thực hiện công việc, thì bạn có thể gọi trực tiếp cho họ. Ngoài ra, bạn có thể điền bất kỳ thông số ARGV nào, giả sử phương thức puts và chỉ cần require tệp, điều này sẽ mang lại cho bạn trải nghiệm gần gũi để chạy nó, nhưng bạn có thể sử dụng Timecop một cách hiệu quả .

Các vấn đề liên quan