2013-05-15 33 views
8

Tôi muốn khai báo một phương thức với Mocha chỉ khi một giá trị tham số cụ thể được đưa ra và gọi phương thức gốc khi có bất kỳ giá trị nào khác.Mocha: phương pháp stubbing với tham số cụ thể nhưng không cho các tham số khác

Khi tôi làm điều đó như thế này:

MyClass.any_instance.stubs(:show?).with(:wanne_show).returns(true) 

tôi nhận được một

unexpected invocation for MyClass.show?(:other_value) 

Tôi cũng biết, mà tôi có thể còn sơ khai tất cả các thông số khi viết các mô hình mà không có sự'with' gọi và sau đó cho mô hình cụ thể của tôi. Nhưng sau đó tôi phải biết giá trị trả lại cho mỗi cuộc gọi, không phải là trường hợp:/

tldr; Có cách nào để gọi phương thức gốc trong một bài sơ khai hoặc để chỉ phân tích các tham số cụ thể và để các thông số khác không?

Trả lời

1

Câu trả lời tùy thuộc vào chính xác những gì bạn đang thử nghiệm.

Một số lưu ý:

1) Tôi luôn tránh sử dụng stubs.any_instance. Bạn có thể được cụ thể trong stubs của bạn/mocks, mà ngăn chặn dương tính giả thử nghiệm.

2) Tôi thích sử dụng gián điệp cùng với khai, để chủ động khẳng định rằng một cái gì đó đã được gọi. Chúng tôi sử dụng đá quý bourne cho mục đích này. Cách khác là sử dụng một mô hình, mà kiểm tra ngầm định nếu một cái gì đó đang được gọi (ví dụ như sẽ thất bại nếu nó không được gọi.

Vì vậy, phương pháp lớp của bạn trông giống như thế này (lưu ý, đây là RSpec) cú pháp):.

require 'bourne' 
require 'mocha' 

it 'calls MyClass.show?(method_params)' do 
    MyClass.stubs(:show?) 

    AnotherClass.method_which_calls_my_class 

    expect(MyClass).to have_received(:show?).with('parameter!') 
end 

class AnotherClass 
    def self.method_which_calls_my_class 
    MyClass.show?('parameter!') 
    end 
end 

có rất nhiều ví dụ về bài/gián điệp here

Hope this helps

+0

Bạn không cho thấy làm thế nào để tránh sử dụng 'any_instance' mặc dù kinh nghiệm của tôi này.. yêu cầu additi onal mocking ra khỏi mã instantiation mà có thể hoặc có thể không được bằng nhau hoặc thậm chí nhiều hơn lỗi dễ bị và giòn. – gtd

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