(Rspec) expected #count to have changed by 1, but was changed by 0

899 Views Asked by At

I started to learn Rspec one day ago. When writing test for my articles controller, I got error at create new article. Here is my controller:

def create
    Article.transaction do
      begin
        @article = Article.new(article_params)
        respond_to do |format|
          if @article.save
            view_context.create_sitemap
            flash[:show_alert] = true
            format.html { redirect_to edit_admin_article_path(@article), notice: 'Created sucessfull' }
          else
            format.html { render :new }
            format.json { render json: @article.errors,notice: "Unprocessable entity" }#may need a helper to handle exception
          end
        end
      rescue Exception => e
        raise ActiveRecord::Rollback
        respond_to do |format|
          flash[:show_alert] = true
          format.html { redirect_to new_admin_article_path, notice: 'Create failed'}
        end
      end
    end
  end

here is my test:

describe "POST #create" do 
    context "with valid attributes" do 
      it "creates a new article" do
        expect{
          post :create, params: { article: FactoryGirl.attributes_for(:article) }
        }.to change(Article, :count).by(1)
      end
      it "redirects to the index page" do
        post :create, params: { article: FactoryGirl.attributes_for(:article) }
        expect(response).to redirect_to admin_articles_path
      end
    end

    context "with invalid attributes" do
      it "does not save the new article" do 
        expect{
          post :create, params: { article: FactoryGirl.attributes_for(:article) }
        }.to_not change(Article, :count).by(1)
      end
      it "re-renders the :new template" do
        post :create, params: { article: FactoryGirl.attributes_for(:article) }
        expect(response).to render_template :new
      end
    end
  end

And here is the log:

3) Admin::ArticlesController POST #create with valid attributes creates a new article
     Failure/Error:
       expect{
         post :create, params: { article: FactoryGirl.attributes_for(:article) }
       }.to change(Article, :count).by(1)

       expected #count to have changed by 1, but was changed by 0
     # ./spec/controllers/admin/articles_controller_spec.rb:29:in `block (4 levels) in <top (required)>'

I spent time to search for the same issue but, all of them didn't solve my error. My problem is I cannot find out where the error come from. Any help is appreciated.

0

There are 0 best solutions below