2014-02-19 3 views
0

Я изучаю рельсы с помощью Rails Tutorial. Автор активно преподает выборочные биты RSpec. В упражнениях после каждой главы у вас есть возможность научиться писать более строгий код. Я решил сделать эти упражнения. Но проблема заключается в следующих главах: он обращается к читателю так, как будто этого не делал, поэтому более наглядный код, который вы написали, создает проблемы, когда вы не знаете, как приспособить новый «неуловимый» код, который он пишет, это «более крутой» аналог.Ruby on Rails RSPEC

В содержательных версиях, начало файла поддается меньше повторов, и выглядит так:

require 'spec_helper' 

    describe User do 

    before { @user = User.new(name: "Example User", email: "[email protected]", 
           password: "foobar", password_confirmation: "foobar") } 

    subject { @user } 

    it { should respond_to(:name) } 
    it { should respond_to(:email) } 
    it { should respond_to(:password_digest) } 
    it { should respond_to(:password) } 
    it { should respond_to(:password_confirmation)} 

    it { should be_valid } 
    . 
    . 
    . 
end 

Итак, наши тесты выглядеть так:

describe "when email is not present" do 
    before { @user.email = " " } 
    it { should_not be_valid } 
    end 

При попытке чтобы создать тест на наличие или отсутствие @user.password и @user.password_confirmation, я хочу продолжить этот формат RSpec.

версия авторов выглядит так:

describe "when email is not present" do 
    before do 
    @user= User.new(name: "Example User", email: "[email protected]", 
        password: " ", password_confirmation = " ") 
    end 
    it { should_not be_valid } 
end 

Моя попытка на него (так как автор переходит к методу ведения дел без осуществления pithier кода RSpec) будет как таковой:

describe "when password is not present" do 
    before { @user.password = " ", @user.password_confirmation = " " } 
    it { should_not be_valid } 
end 

Является ли это правильным способом изменения нескольких значений хэша с использованием ранее в этом контексте?

Кроме того, я изо всех сил пытаюсь найти ответы на мои вопросы RSpec. У кого-нибудь есть твердая рутина для поиска таких ответов?

ответ

1

Обычно, если у вас есть блок, который занимает несколько строк, вы должны использовать do...end вместо { }, так что ваш код будет выглядеть следующим образом:

describe "when password is not present" do 
    before do 
    @user.password = " " 
    @user.password_confirmation = " " 
    end 
    it { should_not be_valid } 
end 

При поиске ответов на соответствующие Rspec вопросы, я обычно поверните сначала к Google, но я бы рекомендовал попытаться сузить ваш поиск (например, если вы используете rSpec и Capybara, ознакомьтесь с документами Capybara, так как я не нашел документы rSpec очень полезными). Затем я бы посмотрел здесь (как и вы), поэтому я думаю, что вы на правильном пути.

+0

Удивительно, спасибо, это было полезно! Я использую Capybara, поэтому я посмотрю на их документы. Кроме того, вам нужно окружать отдельные строки блоком '{}', или вы можете их оставить? – EnergyWasRaw

0

В версии автора, это before блок также создает переменную экземпляра @user для ввода каждого it. Создание нескольких значений хэша должно быть передано некоторым параметрам метода, которые вот так: def some_method(args, hash_options = {}). Это рубиновый стиль, который ставит хэш-параметры в метод, а затем помещает его в блок Rspec before. Блок before используется для создания экземпляра требуемого исполнения перед входом в блок it. Поэтому в вашем случае я бы предложил не просто добавлять несколько значений хэша в блок before, а вместо этого подготовить некоторый экземпляр объекта с этими параметрами хеша, поэтому вы можете запустить объект в своем блоке it.

Я предлагаю прочитать его иметь обзор Rspec:

Повседневные Rails Тестирование в Rspec,
https://leanpub.com/everydayrailsrspec

Интернет ресурс:

Лучше функции,
http://betterspecs.org/