2013-02-20 44 views
7

Tôi cố gắng kiểm tra một lớp với RSpec2, có một số phương thức riêng, được gọi từ một số phương thức công khai. Tôi thử nghiệm các phương pháp công khai vớiRSpec: Phương thức riêng tư sơ khai

@foo.should_receive(:start_training).exactly(2).times 

nếu chúng được gọi và tần suất. Vấn đề của tôi là, cách tiếp cận này không làm việc với các phương thức riêng. Vì vậy, có cách nào để sử dụng sth như @foo.send(:private_method) kết hợp với should_receive? Hoặc bất kỳ cú pháp nào khác?

Trả lời

10

should_receive (: Phương pháp) hoạt động cho dù: Phương pháp là công hay tư ...

+1

eehmm ... Tôi chắc chắn rằng nó hoạt động. Bạn có thể giải thích thêm về ý nghĩa của bạn không? – 23tux

+0

Tôi đã thử nó, khi tôi cố gắng gọi should_receive với một phương thức riêng, tôi nhận được 'phương thức riêng' start_training 'được gọi là # ' – 23tux

+0

Bạn có thể đăng thêm một chút mã không? Trong spec tôi đang làm việc trên atm, tôi nên_receive'ing phương pháp tư nhân không có vấn đề ... –

0

Tại sao bạn muốn thử nghiệm các phương pháp riêng tư? Họ là riêng tư vì một lý do; để ngăn truy cập từ các cuộc gọi bên ngoài. Thử nghiệm các phương pháp công khai dựa vào các phương pháp riêng tư là đủ.

+6

Tôi chắc chắn rằng nó đáng để thử nghiệm các phương pháp riêng tư. Nếu không, nếu bạn có 10 phương thức công cộng dựa vào phương thức riêng tư đó, bạn có thể tự mình lặp lại kiểm tra hành vi của tất cả các phương thức đó. –

+1

@ AndréHerculano có, nhưng bạn nên kiểm tra hành vi, không thực hiện. Bạn sẽ kiểm tra lợi nhuận của các phương thức công khai đó, bất kể chúng sử dụng phương thức riêng nào. –

5

Bạn có thể sử dụng phương pháp để allow_any_instance_of còn sơ khai hoặc nhạo báng bất kỳ trường hợp của một lớp cho ví dụ bạn có một class tên Foo với một số private phương pháp hơn bạn có thể làm điều gì đó như thế này

allow_any_instance_of(Foo).to receive(:private_method) do 
    #do something 
end 

Trong trường hợp nếu có bạn có module cũng có, bạn có thể làm một cái gì đó như thế này

allow_any_instance_of(Module::Foo).to receive(:private_method) do 
    #do something 
end 

Bạn có thể tìm thêm chi tiết về phương pháp allow_any_instance_of() tại Official Documentation

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