Unit Test Problem
-
Selam arkadaslar
Xamarin.Forms ile yapilmis bir proje var. Ana proje'de bir constant tanimlayinca (project properties-> compiler-> define symbols da). oraya atiyorum yabancisurucu yaziyoruz ve proje icinde bazi kodlar/classlar o proje icin aktif oluyor. Bunu da conditional directive ile yapiyoruz
#if yabancisurucu
----
#else
----
#endif
seklinde. Tabi baska bir kac sey daha var ama onlar cok gerekli degil.
Eger yabancisurucu constant olarak gelmisse, onun login metodu ayri, ama normalsurucu ise login metodu daha farkli.
Simdi sorun ise unit test projesinde. Unit testler ayni solution altinda farkli bir proje'de yazilmis.
Ben ana projede yabancisurucu sectigimde, unit test projesinde bunun ne oldugunu anlayamiyorum. O yüzden normalsurucu login test metodu calisiyor. Benim o metodu calistirmamam ya da yabancisurucu metodunu cagirmam lazim.
Yani iki proje arasinda (ana proje ve test proje) bu constant degeri bir sekilde tasimam gerekiyor.
Simdi derseniz ki, test projesinde de bu constant'i olustur. O zaman da söyle bir problem var; bunlar push edildikten sonra teamcity'e gidiyor. Orada da build ediliyor. Ve orada sadece unit test'i cagirinca yabancisurucu constant'i tanimlasak bile, nasil ana projeye o constant'i verecegiz? Daha karisik bir yapiya evriliyor. O yüzden ilk anlattigim sekilde bu isi cözebilirsem benim icin harika olacak.
Umarim anlasilmistir problem :) Fikirlerinizi bekliyorum.
Not: Ana projede bir class var ve orada söyle bir sey yaptim
#if yabancisurucu
appRuntimeInfo.AppType = AppType.YabanciSurucu;
#else
appRuntimeInfo.AppType = AppType.NormalSurucu;
#endif
appRunTimeInfo'ya proje icinde erisiyorum (DI sagolsun) ve conditional directive yazmadan direk hangi tip oldugunu anliyorum.
Bu degere test projesinde ulasmaya calistigimda bana hep NormalSurucu dönüyor nedense. Halbu ki define symbols'da yabancisurucu olarak ekli..
-
sonunda sorunu cözdük.
-
unbalanced bunu yazdı
sonunda sorunu cözdük.
kahkaha attım
tebrik ederim de insan bari şunu böyle yapmak çözüm oldu yazar, kimseye faydası olmasa yarın döner bakar okur yaparsın hocam :D
-
yalinyalniz bunu yazdıunbalanced bunu yazdı
sonunda sorunu cözdük.
kahkaha attım
tebrik ederim de insan bari şunu böyle yapmak çözüm oldu yazar, kimseye faydası olmasa yarın döner bakar okur yaparsın hocam :D
yazacaktim hocam da baya yoruldum, kac saattir bunla ugrasiyorduk. Aslinda burdan kimsenin pek isine yaracagini sanmam ama kisaca söyle
bir tane customdefineconstants olusturduk hem debug hem unittest isminde bir configuration icin (csproj dosyasinda).
ve localde denerken de söyle yaptik
build icin
msbuild proje.sln /t:Clean,Restore,Build /p:Configuration=UnitTest /p:Platform="Any CPU" /p:CustomDefineConstants=yabancisurucu
dotnet test --configuration=UnitTest /p:Platform="Any CPU" /p:CustomDefineConstants=yabancisurucu
bu sekilde calisiyor. Test projesinde
#if yabancisurucu
Assert.True(True);
#else
// normal sürücü icin kodlar
#endif
yaptik, bu sekilde sorun olmadan yabancisurucu'yu aliyor.
Isin team city tarafinda ise;
build stepsler var, orada da build ve test admina üstteki kodlari ve parametreleri gectik.
Otomatik olacagi icin /p:CustomDefineConstants=%env.AppType% seklinde yaptik ki build edilirken hangi tür oldugunu sectigimizde burdan otomatik alsin diye :)
Burada dikkat edilmesi gereken önemli bir nokta ise; sln dosyasinda "Any CPU" seklinde yazilan platform, csproj'lerde AnyCPU seklinde yaziliyor. Bu tarz scriptler vs ugrasiyorsaniz bu farki gözetmeniz gerek. Eger sln (solution)'yi build edecekseniz platform' yazarken Any CPU seklinde olmali, csproj (project) build edecekseniz de platform verirseniz AnyCPU seklinde olmali. Benzer sikintiyi 7 yil önce de TFS'de benzer isleri yaparken yasamistim :)
Sorun bu sekilde cözüldü. Tabi bu asamaya gelmek icin cok deneme yanilma yaptik ama olay bu :)