2013-02-09 11 views
12

Bir prosedür C/C++ projesi üzerinde çalışıyorum. Genel arayüz, her biri oldukça karmaşık görevlere sahip 4 işlevden oluşur. İsimsiz bir ad alanında aynı cpp dosyasında bildirilen yardımcı işlevler vardır. Kullanılan test çerçevesi GTest'dir. Bununla birlikte, bu yardımcı işlevlerin bazıları kendi birim testlerini gerektirecek kadar karmaşık hale gelmektedir. Normal olarak, bu yardımcıları kendi test edilebilir birimlerine göre yeniden düzenlerim, ancak proje gereksinimleri her şeyin bir cpp'da olması gerektiğini belirtir ve yalnızca belirtilen işlevler herkes tarafından görülebilir.Birim Adlandırma Adsız Ad Alanı İçinde C++ Kodu

Birleştirmeyi en aza indirirken ve proje gereksinimlerini olabildiğince yakından takip ederken yardımcı işlevleri test edebilmemin bir yolu var mı?

Muhtemel bir çözüm, ad alanını test için adlandırılmış bir adla ve üretim için adsız olarak döndürmek için bir makro kullanmaktı. Ancak, bu, istediğimden biraz daha karışık görünüyordu.

+0

Olası kopyası [Özel yöntemleri, alanları veya iç sınıfları olan bir sınıfı nasıl sınıyorum?] (Https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that -has-özel-yöntemler-alanlar-veya-iç-sınıflar) – Raedwald

cevap

12

Anonim bir namespace'daki tüm tanım ve bildirimler yalnızca aynı çeviri birimi içinde görünür.

Bu özel işlevleri birim testine alabileceğiniz iki yaklaşım vardır.

_test.cpp dosyanızda test edilmekte olan .cpp dosyasının tamamını #include yapabilirsiniz.

Belki daha iyi bir yaklaşım foonamespace proje olan foo::internalnamespace, içine özel bir kod taşımaktır - (eğer üretim kodunda bu yapmaması gereken #include.cpp dosyaları ing kodu yeniden için iyi bir yol değildir!) normal olarak kullanır ve özel bildirimleri bir -internal.h dosyasına koy. Üretiminiz .cpp dosyalarınız ve testleriniz bu dahili başlığı dahil etmesine izin verilir, ancak müşterileriniz değildir. Bu şekilde, dahili uygulamanızı müşterilerinize sızmadan tamamen test edebilirsiniz.

+0

Teşekkür ederim, bu çok yardımcı olur. –

+6

İkinci yöntemde, nesnelerin adlandırılmış ad alanına taşınması, başvurulan çalışma zamanı kimliğini koruyacağı anlamına gelir ve anonim ad alanının kullanılmasının nedenini geçersiz kılar - derleme biriminden herhangi bir erişimi tamamen yasaklar… Ayrıca, yanlışlıkla ad çakışmasına izin veriyor gibi görünüyor … – Eonil

+0

Gerçekten ilk fikrin gibi. Birinin bunu yapmak için beni vuracağını merak ediyorum. – zehelvion