Тесты Rspec: он {должен ответить_ (()} - PullRequest
1 голос
/ 02 февраля 2012

Если у вас есть список атрибутов, которые вы проверяете на их наличие, и у вас есть следующее:

before do
  @attr = Employee.new(name: "One",
                       email: "onetwo@three.com")
end

subject { @attr }

it { should respond_to(:name) }
it { should respond_to(:email) }

it { should be_valid }

Можете ли вы затем проверить обратное, а именно, если эти атрибуты не заполнены, используя:

it { should_not respond_to(:reverse, :blank) }
it { should_not be_valid }

Я попробовал описанное выше, но не очень хорошо разбираюсь в проблемах, даже после прочтения этого обсуждения .

Кто-нибудь знает, как использовать ту же инициализацию для проверки наличия, а затем для проверки и проверки пустых атрибутов?

Ответы [ 2 ]

23 голосов
/ 03 февраля 2012

Я думаю, вы неправильно поняли, что respond_to делает в ваших тестах. Когда вы делаете

it { should respond_to(:name) }

Вы утверждаете, что @attr.respond_to(:name) возвращает true, что означает, что метод присутствует, а не что он возвращает значение. Если вы хотите проверить, что есть возвращаемое значение, вы можете сделать что-то вроде:

its(:name){ should be_present }

Это гарантирует, что результат вызова метода name вернет непустое, непустое значение. Затем, когда вы откроете этот тест

its(:name){ should_not be_present }

Вы утверждаете, что метод name возвращает пустое значение. Вам потребуется создать другую настройку для второго теста, поскольку вы тестируете объект в другом состоянии.

0 голосов
/ 03 февраля 2012

Ваши индивидуальные тесты на объекте пользователя должны быть похожи на это:

it "should have an email attribute" do
  @attr.should respond_to(:email) }
end

Однако, если вы тестируете класс, могу ли я предложить что-то еще для этого теста:

before (:each) do
  @attr = {name: "One", email: "onetwo@three.com"}
end

Тогда ваш первый тест гарантирует, что создание работает следующим образом:

it "should create a new instance given valid attributes" do
  Employee.create!(@attr)
end

Как только вы установили, что это работает, вы можете продолжить другие ваши тесты и автоматически создать сотрудника.например, так:

describe "Attributes and method tests" do
  before (:each) do
    @employee = Employee.create(@attr)
  end

  it "should have a name attribute" do
    @employee.should respond_to(:name)
  end

  it "should have an email attribute" do
    @employee.should respond_to(:email) }
  end

  # etc... (to test other attributes or methods)
end

Чтобы ответить на ваш вопрос о реверсии теста и указании, что он недействителен, если атрибуты не заполнены, я бы попробовал что-то подобное.Эти тесты были бы хороши, если бы у вас были проверки на наличие:

it "should not be valid with a blank email" do
  Employee.new(@attr.merge(:email => '').should_not be_valid
end

it "should not be valid with a blank name" do
  Employee.new(@attr.merge(:name => '').should_not be_valid
end
...