2015-05-14 4 views
1

Каждое тело, кажется, говорит о TDD и BDD в эти дни, поэтому я подумал, что даю ему попробовать небольшой проект дома.Модульное тестирование с расширениями Rspec и C

Короткий backgrund Я разрабатываю класс Device в расширении C, который взаимодействует с собственным C API для управления удаленными устройствами, такими как переключатели света и т. Д.

Чтобы сделать тесты более независимыми от платформы, я высмеял API C, чтобы вести себя как исходный, но вместо управления оборудованием он устанавливает глобальную переменную состояния рубина (хэш, содержащий все устройства ).

Все это нормально и работает должным образом. Я могу скомпилировать и связать эту библиотеку вместо реальной.

Теперь часть я нужна помощь в том, как проверить это следующее какое-то лучшая практику у меня есть следующие спецификации, чтобы описать мой Device класса

describe Device do 
    describe ".get" do 
     context "Specified id exists" do 
     it "Returns a instance of Device" 
     it "Device has same id as specified" 
     end 
     context "Specified id is undefined" 
     it "throws UndefinedDeviceException" 
     end 
    end 
    describe "#turn_on" do 
     context "Device supports turning on" do 
     # I set up the mock state to have a device that supports on.. 
     # how do i get the Device instance here? is it ok to depend on 
     # Device.get method? 
     it "Returns true" 
     it "Set device state to on" # Check mocked state 
     end 
    end 
    ..... 
    end 

Теперь, насколько я понимаю, в каждой установке я контекст состояние моей издевавшейся библиотеки, чтобы отразить то, что я хочу проверить, и я вызываю метод. Это хорошо работает для статического метода Device.get(id), потому что это возвращает новый Device, что я не уверен в том, как тестировать методы экземпляра. Если я хочу протестировать метод turn_on, мне нужно сначала иметь экземпляр Device, что означает, что мне нужно позвонить Device.get, чтобы действительно получить устройство? но если это так, я снова «тестирую» метод класса get? Я предполагаю, что я действительно спрашиваю здесь, является хорошей практикой, чтобы получить экземпляр объекта в Rspec, если он зависит от внешней библиотеки.

ответ

1

Вызов Device.get звуков для меня - в этих тестах вы будете тестировать некоторый метод возвращаемого объекта устройства, а не получать его.

В то время как тесты должны быть независимыми, вы неизбежно закончите с некоторыми тестами, которые используют методы, проверенные другими тестами - например, набор тестов активной записи имеет множество тестов для create и find, но эти методы используются лотами других тестов.

Что может быть сложно в этой области - решить, на каком уровне высмеивать - вы можете просто проверить свои издевательства и нет (или немного) фактической реализации.

+0

Хорошо, тогда я на правильном пути, я думаю. Спасибо Что касается просто тестирования мошенников, я думаю, что это компромисс. В моем конкретном случае уровень абстракции от C API довольно велик, поэтому я думаю, что его стоит тестировать. – Patrik