programing

App_Code에 저장된 Unit Testing ASP.net 웹사이트 프로젝트 코드

lastmoon 2023. 8. 25. 23:53
반응형

App_Code에 저장된 Unit Testing ASP.net 웹사이트 프로젝트 코드

ASP.net 웹 사이트 프로젝트(.net 3.5)가 있습니다.현재 코드 뒤에 있는 모든 비코드 파일(Linq2Sql stuff, 데이터 컨텍스트, 비즈니스 로직, 확장 메서드 등)은 App_Code 폴더에 있습니다.

저는 프로젝트의 적어도 일부 섹션에서 유닛 테스트(nunit 사용)를 도입하는 것에 관심이 있습니다.유닛 테스트를 수행하려면 App_Code 폴더에 있는 모든 코드에 대한 전체 액세스 권한이 있어야 합니다.저는 지금까지 일부 초기 읽기를 수행했으며, 합의는 다음과 같습니다.

  • 현재 설정에서는 이 작업을 수행할 수 없습니다.
  • 장치 테스트에서는 컴파일된 dll의 일부인 클래스를 참조해야 하며, 웹 사이트 프로젝트는 정의상 런타임에만 컴파일됩니다.
  • 계속하려면 전체 프로젝트를 웹 응용 프로그램으로 변환하거나 테스트할 모든 코드(App_Code의 전체 내용)를 클래스 라이브러리 프로젝트로 이동하고 웹 사이트 프로젝트에서 클래스 라이브러리 프로젝트를 참조해야 합니다.두 가지 모두 컴파일된 dll 형식으로 필요한 클래스에 액세스할 수 있으므로 Unit Test를 수행할 수 있습니다.

이거 맞는건가요?아니면 전체 프로젝트를 재구성하거나 리팩터링하지 않고 Unit Test를 수행할 수 있는 다른 방법이 있습니까?

저희 가게는 MVC 프로젝트에 대한 답변을 드디어 해냈습니다.그리고 저는 StackOverflow에서 많은 막다른 골목을 쫓으면서 그것을 공유하고 싶습니다. 많은 사람들이 그것이 불가능하다고 말하는 것을 듣습니다.이 작업은 다음과 같습니다.

  • 로컬 iis에서 웹 사이트로 MVC 폴더를 열어 인텔리전트 기능과 디버깅 기능이 제대로 작동합니다.
  • 소스 제어 디렉토리에 있는 단위 테스트 프로젝트 추가
  • 웹 사이트로 열려 있는 프로젝트에는 빌드 전 단계를 추가할 수 없으므로 TEST 프로젝트에 빌드 전 단계를 추가합니다.이매진 웹사이트는 \FooSite이고 우리의 테스트 프로젝트는 \FooSite입니다.테스트. 컴파일된 앱 코드는 FooSite에서 종료됩니다.테스트\FooSite_Precompiled\bin.
  • *
<Target Name="BeforeBuild">
     <AspNetCompiler VirtualPath="FooSite" TargetPath="$(ProjectDir)\FooSite_Precompiled" Force="true"
 Debug="true" />   </Target>
  • 테스트 프로젝트에서 FooSite_Precompiled/bin/App_Code.dll에 대한 참조를 추가합니다.
  • 쾅, 바로 그거야.당신은 당신의 케이크를 가지고 그것을 먹을 수 있습니다.솔루션에서 빌드를 클릭할 때마다 MSBuild와 달리 app_code를 컴파일할 수 있는 웹 사이트 csproj(아직 존재함)의 aspnet_code.ext 도구를 호출하며, Debug="true"를 사용하면 단위 테스트를 디버깅할 때 app_code.debug 코드로 들어갈 수 있습니다.또한 업데이트된 유닛 테스트를 실행할 때만 빌드하면 됩니다.변경사항이 페이지에 미치는 영향을 볼 때 웹 서버에서 호출하면 app_code 폴더가 동적으로 컴파일되므로 Change Code/Save/Refresh Page만 사용하면 됩니다.

당신의 결론은 옳은 것 같습니다.기능성을 하나 또는 여러 클래스 라이브러리 프로젝트로 이동하는 것에 찬성합니다. 다른 프로젝트에서도 동일한 기능을 재사용할 수 있는 문이 열릴 수 있기 때문입니다.

우리 회사에서 이 문제가 발생했습니다(제 상사는 DLL을 좋아하지 않습니다. 버전 관리에 대한 약간의 쓰레기...).

이를 위해 자주 사용하는 두 가지 방법이 있습니다.

CI 툴을 통해 유닛 테스트를 수행합니다.NAT은 UNIT 통합이 매우 긴밀한 TeamCity를 사용하고 있으며, NAT 솔루션은 이 옵션이 유효할 수 있을 만큼 충분히 빠르게 구축되고 테스트도 거의 수행되지 않습니다.

수동으로 사전 컴파일하고 결과 바이너리를 단위 테스트합니다.명령줄에서 ASP.net 컴파일러 / MSBuild를 실행하고('게시' 빌드를 수행하는 것처럼) 결과 이진 파일을 단위로 테스트할 수 있습니다.

그러나 코드를 바이너리(클래스 라이브러리)로 분리하거나 웹 응용 프로그램을 사용할 수 있는 옵션이 있다면 더 나은 대안으로 제안합니다.

Brian의 솔루션을 구현하는 사용자가 있다면, 여기 유닛 테스트 솔루션에 포함할 수 있는 Website.targets 파일이 있습니다.App_Code 변경 시에만 웹사이트를 컴파일(재)합니다.다음과 같은 것을 추가합니다.

  <PropertyGroup>
    <WebsiteName>MyWebsite</WebsiteName>
    <WebsitePath>..</WebsitePath>
  </PropertyGroup>
  <Import Project="$(ProjectDir)\Website.targets" />
  <Target Name="BeforeBuild" DependsOnTargets="CompileWebsite">
  </Target>

정의 .svroj, 사용자 정의WebsiteName그리고.WebsitePath떠날 준비가 되어 있어야 합니다.targets: 웹 사이트입니다.대상:

<?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>

App_code를 사용하는 동안에도 가능할 것으로 보이지만, 프레드릭과 콜린이 제안하는 대로 이 로직을 자체 클래스 라이브러리 프로젝트로 옮기거나 프로젝트 유형을 웹 애플리케이션으로 변경할 것입니다.

나는 항상 나만의 ASP를 만듭니다.NET 프로젝트는 웹 사이트가 아닌 웹 응용 프로그램 프로젝트입니다.

그리고 OP가 말했듯이 웹 앱 프로젝트로 이동하는 것도 가능합니다. 더 깨끗하다고 말씀드리고 싶습니다. 당신의 페이지는 웹 앱 프로젝트에 머물 수 있습니다. 당신은 그것들을 하나의 DLL(테스트 가능한)로 가질 것입니다.모든 비즈니스 논리 등은 별도의 클래스 라이브러리/라이브러리에 저장됩니다.

프로젝트를 웹 앱으로 변환하거나 클래스 라이브러리 프로젝트로 이동하지 않고 App_Code 폴더에 저장된 테스트 클래스를 단위화할 수 있습니다.

필요한 것은 코드 파일의 빌드 액션을 컴파일로 설정하는 것입니다.이로 인해 웹 사이트 디버깅 및 유닛 테스트에서 .dll 파일이 출력됩니다.

이제 단위 테스트 프로젝트에서 웹 사이트 프로젝트를 참조하면 app_code 폴더의 클래스가 표시됩니다.

참고:

.cs 파일 설정 중'Build Action로.Compile웹 사이트에서 디버깅 및 장치 디버깅 시 .vmdk 파일을 생성합니다..dll 파일은 웹 사이트를 디버그할 때 문제를 일으킬 것입니다. IIS가 이제 bin과 App_Code 폴더 두 곳에서 코드를 찾고 어떤 것을 사용해야 할지 모르기 때문입니다.나는 현재 디버그를 하고 싶을 때 .dll 파일을 삭제합니다.

저는 브라이언 화이트의 솔루션을 변경해야 했습니다.PhysicalPath기여하다.또한 사용하지 않습니다.Default Web Site그리고 그것을 바꿔야 했습니다.VirtualPath내 웹 사이트 이름에 대한 속성.

<Target Name="BeforeBuild">
    <AspNetCompiler VirtualPath="myIISsitename.com" PhysicalPath="$(SolutionDir)MySiteFolder" TargetPath="$(ProjectDir)\MySite_Precompiled" Force="true" Debug="true" />
</Target>

결과 dll은 다음과 같습니다.MySite_Precompiled\App_Code.dll

언급URL : https://stackoverflow.com/questions/1198555/unit-testing-asp-net-web-site-project-code-stored-in-app-code

반응형