2014-12-23 3 views
1

Я пытаюсь справиться с новым синтаксисом allow (для stubbing) в rspec 3.0 и действительно оценил бы, кто-то смотрит на мой код и говорит мне, правильно это (или неправильно).rspec 3.0 stubbing синтаксис - не уверен, что правильно

download.rb

class Download 
    def download_file 
    # code to download a file 
    end 

    def valid_json 
    # code to verify downloaded file is file type json 
    end 
end 

download_spec.rb

require 'spec_helper' 
require 'json_spec' 

describe Download do 
    let(:download) {Download.new} 

    describe "#download_file" do 
    it 'downloads a file from remote file location ' do 
     allow(download).to receive(:exist).and_return(true) 
     download.download_file 
     expect(download).to have_received(:exist).and_return(true)  
    end 
    end 

    describe "#valid_json" do 
    it 'confirms downloaded file is JSON' do 
     # download.to_json.should have_json_path("id") 
     # download.to_json.should have_json_type(Integer).at_path("id") 
     expect(download.to_json).to have_json_path("id") 
     expect(download.to_json).to have_json_type(Integer).at_path("id") 
    end 
    end 
end 

Большое спасибо заранее!

ответ

0

Я считаю, что вы используете правильный синтаксис для stubbing в RSpec 3.0, но я сомневаюсь в вашем мотиве для его использования в этом случае. Я настоятельно рекомендую вам ознакомиться с презентациями Sandi Metz по тестированию Ruby, которые, мы надеемся, помогут прояснить соответствующий случай, чтобы фактически использовать заглушку. Вот слайд-колода Sandi's Magic Tricks of Testing.

Основываясь на названии вашего теста, кажется, что то, что вы действительно должны тестировать, заключается в том, создан ли файл-файл в результате этого метода. Это единственное, что вам нужно заботиться - прямой публичный эффект отправки сообщения #download_file объекту download. Что-либо кроме этого означает, что вы тестируете , а не интерфейс .

describe Download do 
    let(:download) { Download.new } 

    describe "#file" do 
    context "before file has been downloaded" do 
     it "returns nil" do 
     expect(download.file).to be_nil 
     end 
    end 
    end 

    describe "#download_file" do 
    it 'downloads a file from remote file location ' do 
     # incoming command message to object under test 
     download.download_file 
     # assert direct public side effect 
     expect(download.file).to be_a File 
    end 
    end 
end 

EDIT: Одна вещь, которую я забыл упомянуть о том, что вам может понадобиться уточнить или ваш вопрос здесь или ваше представление о ваших испытаний, являются ли они предназначены в качестве модульных тестов или тестов интеграции. Это может изменить ответ.

+1

Привет, dnunez24, смешно, что вы должны сказать это о представлении Санди Меца, поскольку я только что смотрел ее разговор об этой теме на YouTube этим утром! Я, вероятно, не был достаточно ясен с моим кодом, но тест на метод загрузки фактически должен был протестировать существование файла, созданного в результате реализации загрузки. Я вернусь и снова посмотрю на палубу Санди. Спасибо за вашу помощь! – user4219550

+0

Хорошо, хорошо. Таким образом, то, что вам может потребоваться, должно быть, должно быть завершено, то есть какой-то код на самом деле извлекает и создает файл. Особенно, если это может занять много времени при выполнении ваших тестов. Мне было трудно дать хороший пример этого, не понимая других зависимостей, связанных с вашим кодом. Вы можете захотеть взглянуть на инъекцию зависимостей, чтобы вы могли намного проще отправлять заглушки в ваши вызовы. Я считаю, что Санди дает некоторые примеры этого. –

+0

Да, это будет единичный тест – user4219550