Testy jednostkowe ASP.net Kod projektu strony internetowej zapisany w kodzie aplikacji
Mam ASP.net Projekt strony internetowej (. NET 3.5). Obecnie wszystkie pliki bez kodu (w tym pliki Linq2Sql, konteksty danych, logika biznesowa, metody rozszerzeń itp.) znajdują się w folderze App_Code.
Jestem zainteresowany wprowadzeniem testów jednostkowych (z wykorzystaniem nunit) w przynajmniej niektórych sekcjach projektu. Wszelkie testy jednostkowe, które bym robił, musiałyby mieć pełny dostęp do całego kodu, który znajduje się obecnie w App_Code folder. Do tej pory zrobiłem kilka wstępnych lektur i konsensus wydaje się być:
- nie będzie to możliwe, biorąc pod uwagę moją aktualną konfigurację
- testowanie jednostkowe wymaga odwoływania się do klas, które są częścią skompilowanej biblioteki dll, A Projekt strony internetowej z definicji kompiluje się tylko w czasie wykonywania.
- aby kontynuować, będę musiał albo przekonwertować cały mój projekt do aplikacji internetowej, lub przenieść cały kod, który chciałbym przetestować (TJ: cała zawartość App_Code) do klasy projekt biblioteki i odwołaj się do projektu biblioteki klas w projekcie strony internetowej. Każda z nich zapewni dostęp do klas, których potrzebuję w skompilowanym formacie dll, co pozwoli mi je przetestować.
Czy to prawda? A może jest inny sposób na Test jednostkowy bez restrukturyzacji/refaktoryzacji całego projektu?
8 answers
Twoje wnioski wydają się poprawne. Głosowałbym za przeniesieniem funkcjonalności do jednego lub kilku projektów biblioteki klas, ponieważ może to otworzyć drzwi do ponownego użycia tej samej funkcjonalności w innych projektach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-29 07:38:32
Mój sklep w końcu opracował odpowiedź na to dla naszego projektu MVC. I chcę się tym podzielić, ponieważ ścigałem wiele ślepych zaułków tutaj na StackOverflow słysząc, że wiele osób mówi, że nie można tego zrobić. Robimy to tak:
- Otwórz folder MVC "jako stronę internetową, z lokalnego iis", który pobiera intellisense i debugowanie działa poprawnie
- Dodaj projekt testów jednostkowych, który mieszka w naszym katalogu kontrolowanym przez źródło
- Dodaj etap wstępnego budowania do projektu testowego, ponieważ nie możemy dodać go do projektu, który jest otwarty jako strona internetowa. Strona Imagine jest \FooSite i nasz projekt testowy to \FooSite.Testy. Skompilowany kod aplikacji zakończy się w Pióropuszu.Tests\FooSite_Precompiled\bin.
*
<Target Name="BeforeBuild">
<AspNetCompiler VirtualPath="FooSite" TargetPath="$(ProjectDir)\FooSite_Precompiled" Force="true"
Debug="true" /> </Target>
- Dodaj odniesienie do FooSite_Precompiled/bin / App_Code.dll w projekcie testowym.
- Bum, to jest to. Możesz zjeść swoje ciasto i je zjeść. Za każdym razem, gdy klikniesz Build in your solution, wywołujesz aspnet_compiler.ext narzędzie na swojej stronie csproj (która nadal istnieje), która jest w stanie, w przeciwieństwie MSBuild, aby skompilować app_code, a debug = "true" pozwala na krok w app_code.kod dll podczas debugowania testu jednostkowego. A Ty trzeba budować tylko wtedy, gdy uruchamiasz zaktualizowane testy jednostkowe. Kiedy patrzysz na efekty swojej zmiany na stronie, po prostu Zmień kod/Zapisz/odśwież stronę od folderu app_code dynamicznie kompiluje po wywołaniu z serwera www.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-01 21:04:26
Mamy ten problem w mojej firmie (mój szef nie lubi bibliotek DLL, jakieś bzdury o wersjonowaniu...)
Mamy dwa sposoby, z których często korzystamy:
1) Pobierz narzędzie CI do testów jednostkowych: używamy TeamCity, który ma dość ścisłą integrację NUnit, a nasze rozwiązanie buduje się wystarczająco szybko (i ma mało testów), aby było to prawidłową opcją.
2) ręcznie wstępnie skompilować i przetestować wynikowe pliki binarne: jest to całkowicie możliwe, aby uruchomić ASP.net kompilator / MSBuild z linii poleceń (tak jakbyś robił kompilację' Publish') i po prostu testować wynikowe pliki binarne.
Jeśli jednak masz możliwość segregowania kodu na binaria (biblioteki klas) lub po prostu za pomocą aplikacji internetowej, sugerowałbym to jako lepszą alternatywę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-21 11:32:05
Jeśli ktoś znajdzie się w implementacji rozwiązania Briana, oto strona internetowa.plik targets możesz dołączyć do rozwiązania do testów jednostkowych. To (re)kompiluje stronę internetową tylko wtedy, gdy App_Code zmienia. Wystarczy dodać coś w stylu
<PropertyGroup>
<WebsiteName>MyWebsite</WebsiteName>
<WebsitePath>..</WebsitePath>
</PropertyGroup>
<Import Project="$(ProjectDir)\Website.targets" />
<Target Name="BeforeBuild" DependsOnTargets="CompileWebsite">
</Target>
Do twojego .csproj, dostosowując WebsiteName
i WebsitePath
i powinieneś być gotowy do pracy. Strona internetowa.cele:
<?xml version="1.0" encoding="utf-8"?>
<!--
Target that compiles Website's App_Code to be used for testing
-->
<Project DefaultTargets="CompileWebsite" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<AppCodeFiles Include="$(WebsitePath)\$(WebsiteName)\App_Code\**\*.*" />
</ItemGroup>
<Target Name="CompileWebsite" Inputs="@(AppCodeFiles)" Outputs="$(ProjectDir)\PrecompiledWeb\bin\App_Code.dll">
<AspNetCompiler VirtualPath="$(WebsiteName)" PhysicalPath="$(WebsitePath)\$(WebsiteName)" TargetPath="$(ProjectDir)\PrecompiledWeb" Force="true" Debug="true" />
</Target>
<Target Name="CleanWebsite">
<RemoveDir Directories="$(WebsitePath)\$(WebsiteName)\PrecompiledWeb" />
</Target>
</Project>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-04 11:32:56
Wygląda na to, że jest to możliwe przy użyciu App_code , ale albo przeniosłbym tę logikę do własnego projektu biblioteki klas lub zmienił typ projektu na aplikację webową, jak sugerują Fredrik i Colin.
Zawsze tworzę swoje ASP.NET projekty jako projekty aplikacji internetowych, a nie Stron Internetowych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-29 08:14:23
I jak OP stwierdził, że możliwe jest również przejście do projektu aplikacji internetowej, który powiedziałbym, że jest czystszy, Twoje strony mogą pozostać w projekcie aplikacji WEP, będziesz je miał w 1 DLL (testowalny). Cała twoja logika biznesowa itp. przechodzi do oddzielnej biblioteki klas / bibliotek.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-29 08:00:06
Możliwe jest testowanie jednostkowe klas przechowywanych w folderze App_Code bez konwersji projektu do aplikacji internetowej lub przenoszenia klas do projektu biblioteki klas.
Wszystko, co jest konieczne, to ustawienie akcji budowania plików kodu do kompilacji. Spowoduje to debugowanie i testowanie jednostkowe witryny do wyjścia .plik dll.
Teraz, gdy odwołujesz się do projektu witryny z projektu testu jednostkowego, klasy w folderze app_code będą widoczne.
Uwaga:
Ustawianie swojego .pliki cs ' Build Action
to Compile
spowoduje, że Twoja strona wygenerujeplik dll dotyczący debugowania i testowania jednostek. The .plik dll spowoduje problemy podczas debugowania witryny, ponieważ IIS będzie teraz znaleźć kod w dwóch miejscach, kosz i folder App_Code i nie będzie wiedział, który z nich użyć. Obecnie po prostu usunąć .plik dll, gdy chcę debugować.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-31 13:04:20
Musiałem zmienić rozwiązanie Briana White ' a dodając atrybut PhysicalPath
. Dodatkowo nie używam Default Web Site
i musiałem zmienić właściwość VirtualPath
na nazwę mojej strony internetowej.
<Target Name="BeforeBuild">
<AspNetCompiler VirtualPath="myIISsitename.com" PhysicalPath="$(SolutionDir)MySiteFolder" TargetPath="$(ProjectDir)\MySite_Precompiled" Force="true" Debug="true" />
</Target>
Wynik dll będzie w MySite_Precompiled\App_Code.dll
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-19 01:11:00