TDD RSpe c Капибара Ruby на Рельсах - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь ознакомиться с Капибарой и другими TDD, и мне не удается. Мой первый пример (сценарий «неудачно опубликовать сообщение без пользователя» делать) должен быть неудачным, поскольку я не ввел пользователя, но он каким-то образом вводится, поскольку вместо получения ожидаемого «Пользователь должен существовать» он говорит «Добро пожаловать» Джон». Мой «before (: each)» все еще бьет по нему, даже если он приходит после или у меня есть какие-то другие проблемы?

/ spec / features / mess_spe c .rb

require 'rails_helper'
feature "post message" do
    scenario "unsuccessfully post a message no user" do
        visit messages_path
        fill_in "message[content]", with: "This is the content of my message."
        click_button "Post a Message"
        expect(page).to have_content "User must exist"      
    end
    before(:each) do 
        visit new_user_path
        fill_in "user[name]", with: "John"
        click_button "Sign In"
        visit messages_path
    end
    scenario "successfully post a message" do
        fill_in "message[content]", with: "This is the content of my message."
        click_button "Post a Message"
        expect(page).to have_content "This is the content of my message"
        expect(current_path).to eq(messages_path)
    end
    scenario "unsuccessfully post a message no content" do
        fill_in "message[content]", with: ""
        click_button "Post a Message"
        expect(page).to have_content "Content is too short"     
    end
    scenario "messages page should have a log out button" do
        click_button "logout"
        expect(current_path).to eq(new_user_path)
    end
end

У меня была похожая проблема с моей спецификацией / models / message_spe c .rb, поскольку мой 2-й тест


it "should not save if no user" do 
     expect(build(:message)).to be_invalid
   end     

также не удался, хотя я просто изменил этому, пропустив заводского бота, так что здесь мой текущий рабочий файл

require 'rails_helper'

RSpec.describe Message, type: :model do
    it "should save" do      
      expect(build(:message, user: build(:user))).to be_valid
    end
    it "should not save if no user" do 
      message = Message.new(
        content: 'This is a message'               
      )
      expect(message).to be_invalid
    end     
    it "should not save content is too short" do 
      message = Message.new(
        content: 'This',
        user_id: '1'       
      )
      expect(message).to be_invalid
    end         
end

1 Ответ

0 голосов
/ 30 марта 2020

Вы правильно догадались по своей проблеме - scenario просто определяет тест - он не определяет порядок тестов, и лучшая практика - запускать тесты в случайном порядке, чтобы убедиться, что между ними нет никакой связи индивидуальные тесты. Это означает, что любой before(:each), определенный в той же или более высокой области, будет запускаться перед каждым scenario, указанным в этой области.

Чтобы решить эту проблему, вы можете использовать любой из RSpecs другой keyworsd, который сформирует новый область действия, например

feature "post message" do
    context "with no user" do
      scenario "unsuccessfully post a message no user" do
          visit messages_path
          fill_in "message[content]", with: "This is the content of my message."
          click_button "Post a Message"
          expect(page).to have_content "User must exist"      
      end
    end

    context "with a user" do
      before(:each) do 
        visit new_user_path
        fill_in "user[name]", with: "John"
        click_button "Sign In"
        visit messages_path
      end

      scenario "successfully post a message" do
        fill_in "message[content]", with: "This is the content of my message."
        click_button "Post a Message"
        expect(page).to have_content "This is the content of my message"
        expect(page).to have_current_path(messages_path)
      end
      scenario "unsuccessfully post a message no content" do
        fill_in "message[content]", with: ""
        click_button "Post a Message"
        expect(page).to have_content "Content is too short"     
      end
      scenario "messages page should have a log out button" do
        click_button "logout"
        expect(page).to have_current_path(new_user_path)
      end
    end
end

Кроме того, вам не следует использовать встроенные средства сравнения RSpecs (eq, et c) с Capybara - вместо этого используйте средства сравнения, предоставленные Capybara, в данном случае have_current_path как я показал выше. Они повторяют поведение и приведут к гораздо более стабильным тестам, когда вы имеете дело со страницами, включая асинхронное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...