首页 > 解决方案 > 是否有与 mockito ArgumentCaptor 等效的 rspec?

问题描述

我有一个 java 项目,它使用 ArgumentCaptor 来断言对特定模拟对象(存根)的调用。是否有等效的 Rails Rspec ArgumentCaptor?我希望能够模拟 ActiveRecord 模型并比较断言传递给保存调用的参数。

更新 1

下面是一个使用 ArgumentCaptor 的 Java 代码示例。请注意装饰模拟的能力,以便收集传递给您正在测试的方法的所有对象,然后对它们进行断言。

 @Test
public void should_import_all_tax_treatment_domain_data() throws Exception {
    // Arrange
    this.mockInputStream("DOMAIN-treatment.json");

    // Act
    this.importService.runImport("DOMAIN-treatment.json");

    // Assert
    ArgumentCaptor<TaxTreatment> argument = ArgumentCaptor.forClass(TaxTreatment.class);

    verify(this.taxTreatmentRepositoryMock, times(9)).findByCode(anyString());
    verify(this.taxTreatmentRepositoryMock, times(9)).save(argument.capture());

    assertEquals("Withhold All", argument.getAllValues().get(0).getName());
    assertEquals("Withhold", argument.getAllValues().get(1).getName());
    assertEquals("Pay Cash", argument.getAllValues().get(2).getName());
    assertEquals("None", argument.getAllValues().get(3).getName());
    assertEquals("Sell All", argument.getAllValues().get(4).getName());
    assertEquals("Sell for Taxes", argument.getAllValues().get(5).getName());
    assertEquals("Swap", argument.getAllValues().get(6).getName());
    assertEquals("Debit Rtl Acct", argument.getAllValues().get(7).getName());
    assertEquals("Payroll Deduction", argument.getAllValues().get(8).getName());

}

标签: ruby-on-railsrspecmockito

解决方案


这似乎是在 RSpec 中实现 Mockito 的第一次尝试: rspec-fire

RSpec3 现在支持 Mocks: rspec3-mocks

Sandi Metz 关于 Mocks 的演讲很好: TDD 魔术

这个关于 Mocks in Ruby 的演讲很有用: Why you don't know mocks


推荐阅读