2015-12-31 3 views
0

Как проверить, правильно ли применяется метод экземпляра для переменной экземпляра?Метод проверки Rspec, который изменяет переменную экземпляра

Учитывая класс:

class MyClass 
    attr_reader :ary 
    def initialize 
    @ary = [] 
    end 
    def update (value) 
    @ary << value 
    end 
end 

Как бы проверить, что #update правильно изменяющую @ary?
До сих пор у меня есть:

describe MyClass do 
    before { @my_class = MyClass.new } 
    describe '#update' do 
    it 'should correctly update the value' do 
     expect(@my_class.update('some_value')).to #what comes next? 

согласовань ищет оценить возвращаемое значение автообновления, а не значение @ary, что это то, что я хочу.

+0

Должен ли я вставить 'перед {@ my_class.update ('some_value'}' 'после описания '' #update do', а затем использовать' ожидать (@ my_class.ary) .то уравнение ([ 'some_value ']) '? – miljinx

ответ

1

Вот краткое пример

describe MyClass do 
    describe "#update" do 
    it "appends the argument to the array" do 
     subject.update(value = 'some_value') 
     expect(subject.ary).to eq([value]) 
    end 
    end 
end 

Несколько заметок по сравнению с вашим исходным кодом. Прежде всего, вы можете положиться на subject. subject определяется как

described_class.new 

Это как с

describe MyClass do 
    subject { described_class.new } 

    describe "#update" do 
    ... 
    end 
end 

или

describe MyClass do 
    describe "#update" do 
    subject = described_class.new 
    end 
end 

, который по существу означает

describe MyClass do 
    describe "#update" do 
    subject = MyClass.new 
    end 
end 

Если вы просто хотите проверить экземпляр, используйте subject. Не используйте перед действиями для установки переменных экземпляра.

Следующая строка

subject.update(value = 'some_value') 
expect(subject.ary).to eq([value]) 

, по существу, ярлык для

value = 'some_value' 
subject.update(value) 
expect(subject.ary).to eq([value]) 

Это помогает мне не писать ожидаемую строку дважды. Остальное должно быть довольно легко понять.

Вы также можете проверить возвращаемое значение, если это необходимо.

describe MyClass do 
    describe "#update" do 
    it "appends the argument to the array" do 
     subject.update(value = 'some_value') 
     expect(subject.ary).to eq([value]) 
    end 

    it "returns the item that was added" do 
     value = 'some_value' 
     expect(subject.update(value)).to eq(value) 
    end 
    end 
end 
+0

Спасибо за советы. Есть ли какой-то консенсус относительно того, когда использовать« тему »? Я видел многочисленные ссылки на [эту статью] (https://robots.thoughtbot.com/lets-not) который говорит, чтобы избежать «субъекта» для более простых тестов. – miljinx

+1

Для очень простых тестов я обычно полагаюсь на 'subject', тогда как для более сложных спецификаций я склонен использовать явные темы, чтобы убедиться, что код более читабельен. всегда иметь явный предмет либо в блоке spec, либо как 'subject {}', но это личное предпочтение. –

+0

Согласитесь, всегда используя явное имя класса ins тиад описанного класса. – MilesStanfield

0

Вызвать метод, а затем проверить @ary

describe MyClass do 
    before { @my_class = MyClass.new } 
    describe '#update' do 
     it 'should correctly update the value' do 
     @my_class.update('some_value') 
     expect(@my_class.ary).to equal(['some_value']) 
Смежные вопросы