2017-02-15 64 views
0

在我的应用程序中,我有服务(纯红宝石)。什么是实施单元测试的最佳方法? shoiuld我为控制器实现额外的单元测试,还是仅为服务创建一个单独的测试?Rails5 - 编写服务单元测试的最佳方法是什么?

更新 - 实施的解决方案:

为UserService(测试/服务/ user_service_test
  • 单元测试
    1. 专用测试用于创建新员工包括验证,如果UserService.create_user_for_employee方法被调用的测试是基于MINITEST:。 :模拟它需要 'MINITEST /自动运行'(需要test_helper 'MINITEST /自动运行')

    EmployeesControllerTest:

    setup do 
        #@employee = employees(:one) 
        @new_employee = {name: 'name', surname: 'surname', email: '[email protected]'} 
        sign_in users(:admin1) 
        @mock = UserService.new 
        end 
    
    test "should create_employee" do 
        assert_difference('Employee.count') do 
         post employees_url, employee: @new_employee 
        end 
    
        @mock.stub :create_user_for_employee, true do 
         assert(@mock.create_user_for_employee(@new_employee, 'user')) 
        end 
    
        assert_redirected_to employees_url 
        end 
    
  • 回答

    0

    您可能在/app/services文件夹中有简单的红宝石类。 然后,为每项服务编写非常简单的单元测试。 将它们放在/test/services/spec/services/文件夹下。 对于为应用程序定义的每个类,您应该有一个单元测试文件。

    +0

    thx - 这就是我所期望的最佳解决方案。但是 - 有一个问题。让employee.save在调用方法UserService.new.create_user(@employee)后说''employee_controller'' - 您想为每个新员工自动创建用户帐户。在这种情况下,我想在我的测试“应该create_employee”我应该断言UserService方法被调用 - 但是当我在看http://edgeguides.rubyonrails.org/testing.html一个没有看到断言....任何想法如何做到这一点? – MaciekR

    +1

    @MaciekR你要找的是Mocks。如果你使用'Test :: Unit',你可以包含Mocha并写入'UserService.expects(:new).once'。在Rspec中,它会像'expect(UserService).to接收(:new)'一样。 –

    +0

    thx - 我根据您的建议更新了我的问题。 – MaciekR

    相关问题