下記のテストコードを作成したのですが、 `get :index params` の下に `expect`のコードを配置すると値がないとエラーが表示されます。  
他のテストコード(モックを使用しない)では `expext` の上にテストしたいコードがあったのに不思議です。 `expect`
でモックを立ててそこにテストしたいコードが実行され値を取得するイメージに なるのでしょうか。  
詳しい方見て頂けないでしょうか？  
よろしくお願い致します。

エラー内容

```

    Failure/Error: @notes = @project.notes.search(params[:term])
           #<InstanceDouble(Project) (anonymous)> received unexpected message :notes with (no args)
    
```

テストコード

```

    require 'rails_helper'
    
    RSpec.describe NotesController, type: :controller do
      let(:user) { double("user") }
      # project_owner, project_idに反応するようになる
      let(:project) { instance_double("Project", owner: user, id: "123") }
    
      before do
        # allowにスタブ化したいメソッドを持つインスタンスを指定する
        # receiveにスタブ化したいメソッドのシンボルを指定して
        # それが返す値を指定する。
        allow(request.env["warden"]).
          to receive(:authenticate!).and_return(user)
        allow(controller).
          to receive(:current_user).and_return(user)
        allow(Project).
          to receive(:find).with("123").and_return(project)
      end
      describe "#index" do
        # 入力されたキーワードでメモを検索すること
        it "searches notes by the provided keyword" do
          # 参考記事だと　allowと一緒に使用されるallowがitの中で使用される
          # projaect.notes.search みたいなチェーンになるその引数は 'rorate tires'
          # このexpectはアプリを動作させる前に追加しないとテストがパスしない、no argsと言われる
          # モックを先に立ててそこにアクセスするイメージなのかもしれない知らないけど
          expect(project).to receive_message_chain(:notes, :search).with("rorate tires")
          get :index,
            params: { project_id: project.id, term: "rorate tires" }
        end
      end
    end
    
```
CC BY-SA 4.0
2021-11-29T03:52:41.077
83862
2021-11-30T02:14:20.083
22565
question
ruby-on-rails ruby rspec mock
RSpecでモックを使用した際にテストしたいコードより先expectを実行する理由が分からない。
スパイと呼ばれるもので、テストしたい処理を実行した後にその処理を監視しているので、中身を確認することができる。  
みたいなイメージと思われる。

### 参考

[RSpecのスパイ(Spy)を理解する](https://qiita.com/johnslith/items/e0f8a55b7913358670fc)
CC BY-SA 4.0
2021-11-30T02:14:20.083
83882
2021-11-30T02:14:20.083
22565
83862
answer