Каждое тело, кажется, говорит о 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, если он зависит от внешней библиотеки.
Хорошо, тогда я на правильном пути, я думаю. Спасибо Что касается просто тестирования мошенников, я думаю, что это компромисс. В моем конкретном случае уровень абстракции от C API довольно велик, поэтому я думаю, что его стоит тестировать. – Patrik