2014-10-16 3 views
1

Я тестирую функцию электронной почты в базовом приложении, которое я создаю с помощью Ruby on Rails. Я получаю NoMethodError для любого теста, где я использую .not_to. Вот это Rspec, предоставляется учебник я следую:Ruby on Rails Rspec NoMethodError: undefined method 'not_to'

require 'rails_helper' 

describe Comment do 
    include TestFactories 

    describe "after_create" do 

    before do 
     @post = associated_post 
     @user = authenticated_user 
     @comment = Comment.new(body: "My comment", post: @post, user_id: 10000) 
    end 

    context "with user's permission" do 

     it "send an email to users who have favorited the post" do 
     @user.favorites.where(post: @post).create 

     allow(FavoriteMailer) 
      .to receive(:new_comment) 
      .with(@user, @post, @comment) 
      .and_return(double(deliver: true)) 

     @comment.save 
     end 

     it "does not send emails to users who haven't" do 
     expect (FavoriteMailer) 
      .not_to receive(:new_comment) 

     @comment.save 
     end 
    end 

    context "without permission" do 
     before { @user.update_attribute(:email_favorites, false) } 

     it "does not send emails, even to users who have favorited" do 
     @user.favorites.where(post: @post).create 

     expect (FavoriteMailer) 
      .not_to receive(:new_comment) 

     @comment.save 
     end 
    end 

    end 
end 

А вот ошибка:

Failures: 

    1) Comment after_create with user's permission does not send emails to users who haven't 
    Failure/Error: expect (FavoriteMailer) 
    NoMethodError: 
     undefined method `not_to' for FavoriteMailer:Class 
    # /home/vagrant/.rvm/gems/ruby-2.0.0-p576/gems/actionmailer-4.0.10/lib/action_mailer/base.rb:482:in `method_missing' 
    # ./spec/models/comment_spec.rb:28:in `block (4 levels) in <top (required)>' 

    2) Comment after_create without permission does not send emails, even to users who have favorited 
    Failure/Error: expect (FavoriteMailer) 
    NoMethodError: 
     undefined method `not_to' for FavoriteMailer:Class 
    # /home/vagrant/.rvm/gems/ruby-2.0.0-p576/gems/actionmailer-4.0.10/lib/action_mailer/base.rb:482:in `method_missing' 
    # ./spec/models/comment_spec.rb:41:in `block (4 levels) in <top (required)>' 

Finished in 4.66 seconds (files took 24.42 seconds to load) 
3 examples, 2 failures 

Failed examples: 

rspec ./spec/models/comment_spec.rb:27 # Comment after_create with user's permission does not send emails to users who haven't 
rspec ./spec/models/comment_spec.rb:38 # Comment after_create without permission does not send emails, even to users who have favorited 

ответ

2

Я подозреваю, что код на этих линиях интерпретируется в другом порядке, к тому, что предназначено:

expect (FavoriteMailer) 
     .not_to receive(:new_comment) 

Попробуйте это:

expect(FavoriteMailer).not_to receive(:new_comment) 

Главное, чтобы отметить, что это хорошая конвенция в Ruby, чтобы не оставлять пробел между вызовом метода и открывающей скобкой для аргументов (хотя это часто может работать, лучше избегать остановки таких головок, как это происходит).

В этом примере это означает, что расстояние между expect и (FavoriteMailer).

+0

Это правильный ответ. – sevenseacat

0

Не правильный метод to_not вместо not_to?

обновление Изменено to_not и not_to наоборот.

+0

обе будет работать. – sevenseacat

Смежные вопросы