2012-03-28 32 views
13

Tôi có một hành động của trình điều khiển Rails để kiểm tra. Trong hành động đó, một phương thức User.can? được gọi nhiều lần với các tham số khác nhau. Trong một trường hợp thử nghiệm cho nó, tôi muốn chắc chắn rằng User.can? ('Rút tiền') được gọi. Nhưng tôi không quan tâm đến lời gọi của User.can? với các thông số khác.Mocha: Cách thêm kỳ vọng của một phương thức khi có nhiều lời gọi với các tham số khác nhau

def action_to_be_tested 
    ... 
    @user.can?('withdraw') 
    ... 
    @user.can?('deposit') 
    ... 
end 

tôi đã cố gắng bên dưới trong các thử nghiệm:

User.any_instance.expects(:can?).with('withdraw').at_least_once.returns(true) 

Nhưng cuộc thử nghiệm thất bại với thông báo chỉ gọi bất ngờ của User.can ('huy động')?. Nếu tôi thêm một kỳ vọng khác với thông số 'tiền gửi', thì thử nghiệm đã trôi qua. Nhưng tôi tự hỏi nếu có bất kỳ cách nào như vậy mà tôi chỉ có thể tập trung vào lời gọi với tham số 'rút' (vì các lời gọi khác không liên quan đến trường hợp thử nghiệm này).

Trả lời

15

tôi chỉ tìm thấy một workaround, bởi loại bỏ dần từng lời gọi với các thông số thích hợp:

User.any_instance.expects(:can?).with('withdraw').at_least_once.returns(true) 
User.any_instance.stubs(:can?).with(Not(equals('withdraw'))) 

http://mocha.rubyforge.org/classes/Mocha/ParameterMatchers.html#M000023

+0

Tôi đã biết [API] (http://gofreerange.com/mocha/docs/Mocha/Expectation.html#with-instance_method) hỗ trợ các giá trị bằng chữ (so sánh trực tiếp với biến) hoặc sinh ra khối, nhưng Tôi không biết chắc cấu trúc 'Not (...)' xuất phát từ đâu. Bạn có thể nói chi tiết hơn không? – Pysis

+0

@Pysis 'Not()' xuất phát từ [Mocha :: ParameterMatchers] (http://gofreerange.com/mocha/docs/Mocha/ParameterMatchers.html) được sử dụng với 'with()'. Chúng có thể là trường hợp lạc đà như 'HasKey()' hoặc trường hợp con rắn như 'has_key()'. 'Không' phải là trường hợp lạc đà vì đó là một từ khóa. –

12

Bạn có thể vượt qua một khối để with và có khối đó kiểm tra các đối số. Sử dụng điều đó, bạn có thể xây dựng một danh sách các lời gọi mong đợi:

invocations = ['withdraw', 'deposit'] 
User.any_instance.expects(:can?).at_most(2).with do |permission| 
    permission == invocations.shift 
end 

Mỗi lần can? được gọi, Mocha sẽ mang lại cho các khối. Khối sẽ kéo giá trị tiếp theo ra khỏi danh sách các yêu cầu được mong đợi và kiểm tra nó so với lời gọi thực tế.

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