2016-09-12 98 views
0

我是RSpec的新手,并在如何使用模拟进行测试中挣扎。 当网络挂接进来这基本上是调用。复杂情况下的Rspec

class InvoiceCreated 
    def call(event) 
    invoice = event.data.object 

    # NOTE: Skip if the invoice is closed. 
    if invoice.closed == false 
     stripe_customer = invoice.customer 
     payment_account = PaymentCardAccount.find_by(stripe_customer_id: stripe_customer) 
     card_invoice = Invoice.find_card_invoice_in_this_month_within(payment_account: payment_account) 

     card_invoice.process_invoice_items(stripe_customer: stripe_customer, 
             event_invoice_id: invoice.id) 
     card_invoice.process!(:pending, id: invoice.id) 
    end 
    end 
end 

我喜欢使用模拟和防止API调用用于测试的下面两行代码。

card_invoice.process_invoice_items(stripe_customer: stripe_customer, 
            event_invoice_id: invoice.id) 

    card_invoice.process!(:pending, id: invoice.id) 

我该如何使用mock?

+0

您正在使用哪种版本的rspec? – hakcho

+0

我使用'rspec-rails','〜> 3.4.2'。 – Tosh

+0

当你说“模拟”时,你究竟想在这里实现什么?你只是想要一个实际上不会做任何事情的虚拟对象,并且不会因为像'NoMethodError:Undefined method process_invoice_items'这样的错误而失败。或者,您是否确实想要存储处理发票的Web API调用,但是要执行此功能的“全面测试”?试图达到什么目的? (也许你可以在上面的帖子中包含当前的测试?) –

回答

1

您可以使用expect_any_instance_of检查是否使用正确的参数调用Invoice#process_invoice_itemsInvoice#process。如果你不关心他们是如何被调用的,你可以将它们存根并使用allow_any_instance_of

expect_any_instance_of(Invoice).to receive(:process_invoice_items) 
expect_any_instance_of(Invoice).to receive(:process!) 

See here更详细的例子,通过rspec-mock基本款了,看你可以用它实际上做什么。

相关问题