2017-02-15 7 views
0

私のアプリでは、サーバーサービス(純粋なルビー)があります。ユニットテストを実装する最良の方法は何ですか? shoiuld私はコントローラーの追加ユニットテストを実装するか、サービスのためにのみ分離テストを作成しますか?Rails5 - サービスの単体テストを書くための最良の方法は何ですか?

アップデート - 実装溶液:UserServiceのため

  1. 専用テスト(UserService.create_user_for_employeeメソッドが呼び出される場合は、新しい従業員を作成するための試験/サービス/ user_service_test
  2. ユニットテストは、検証を含む試験は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/フォルダに配置します。 アプリケーション用に定義したクラスごとに1つのユニットテストファイルが必要です。

+0

thx - これが私が最高の解決策であると考えていたものです。しかし、1つの問題があります。 UserService.new.create_user(@employee)メソッドを呼び出すemployee.saveの後ろにあるemployee_controllerの内側に、新しい従業員ごとにユーザーアカウントを自動的に作成するとします。この場合、私のテストでは、 "create_employee"を呼び出す必要があります。私は、UserServiceメソッドが呼び出されるべきだと主張する必要があります。 - しかし、私がhttp://edgeguides.rubyonrails.org/testing.htmlを見ているとき、そのアサーションは表示されませんどのようにそれを行うにはどのようなアイデア? – MaciekR

+1

@MaciekRあなたが探しているものはモックです。 'Test :: Unit'を使っているなら、Mochaを含めて' UserService.expects(:new).once'と書くことができます。 Rspecでは 'expect(UserService).to receive(:new)'のようになります。 –

+0

thx - 私はあなたの提案に基づいて実装で質問を更新しました。 – MaciekR

関連する問題